爬虫实战【7】Ajax解析续-今日头条图片下载

昨天我们分析了今日头条搜索得到的信息,一直对图集感兴趣的我还是选择将所有的图片下载下来。

我们继续讲一下如何通过各个图集的url得到每个图集下面的照片。

分析图集的组成

【插入图片,某个图集的页面】

我们看上面的这个图片,右面的1/5可以看出,这个图集有5张图片,在图片上右侧点击的话,会打开下一张图片。

我们来看一下这些图片的url在哪里?

分析图集的源代码

【插入图片,图集页的XHR信息】

我们先看一下XHR,返回的仍然是一些json信息,但是每个json里面的内容都不是我们需要的图片的url。

而是一些评论、广告等信息。

那么这些图片的url在哪里呢?

我们再看一下HTML的源代码。

【插入图片,图集源代码】

我们在响应内容中竟然发现了一个gallery,里面包含了5张图片的url。

既然在响应中可以找到内容,我们就可以使用requests的get方法来请求到这些响应,但是如何将每张图片的url提取出来?

从响应中提取URL

【插入图片,gallery内容】

我们仔细看一下,gallery里面,使用json.parse命令,将一个json字符串转换成了对象。里面包含了url信息,但是挺难提取出来。

尤其是在url中存在很多\,相信很多读者都搞不清楚了。我们简单讲解一下:

要匹配字符串中1个反斜杠\怎么写正则表达式?"\",这样可以吗?我们经过尝试,出现异常了。因为在正则表达式中,"\"就是一个反斜杠,对于正则表达式解析式来说,就是一个转义字符,后面啥匹配内容没有,自然报错。我们应该用四个反斜杠"\\"这样就可以了。

代码如下:

import re

re_str_patt = "\\"#这里指的是要匹配一个反斜杠

reObj = re.compile(re_str_patt)

str_test = "abc\cd\hh"#这里的意思是abc\cd\hh

print reObj.findall(str_test)

输出:[‘\‘, ‘\‘]

如果我们使用r,也就是原生字符串,举个例子;

import re

re_str_patt = r"\\"#匹配"\"

reObj = re.compile(re_str_patt)

str_test = "abc\cd\hh"#abc\cd\hh

print reObj.findall(str_test)

输出:[]#啥也没找到。

所以各位读者应该能感觉到,我还是想使用re正则来把url匹配出来的。

当然,图集的title我们也要获取,这时尝试用beautifulsoup来解析吧,省得忘记用法。

3、获取图集页的源代码

def get_page_detail(url):
    try:
        response = requests.get(url)
        if response.status_code==200:
            return response.text
        else:
            return None
    except Exception:
        print(‘请求索引页出错!‘)
        return None

很简单,使用requests很容易就得到了源代码。

4、获取某个图集的所有图片url

def parse_page_detail(html):
    soup=BeautifulSoup(html,‘lxml‘)
    title=soup.select(‘title‘)[0].get_text()
    print(title)
    images_pattern=re.compile(r‘url\\":\\"(.*?)\\"}],\\"uri‘)#url\":\"(url)\"}],\uri
    items=re.findall(images_pattern,html)
    result=[]
    for item in items:
        new_item=‘‘.join(item.split(‘\\‘))#将匹配出来的字符串中的所有\都去除掉
        #result.append(new_item)
        http_pattern=re.compile(r‘(http.*?)","width‘)#匹配所有正常的url地址
        a_items=re.findall(http_pattern,new_item)
        result.append(a_items[0])#取第一个url即可。
    print(result)
    return result

主要的难度在于解析上。上面的代码单纯看的话,很难懂,希望大家能动手尝试一下,看看每一步都输出什么样的结果。

这里就不展开讲解了。

5、运行

def main(offset):
    html=get_page_index(offset)
    for url in parse_page_index(html):
        content=get_page_detail(url)
        parse_page_detail(content)

if __name__==‘__main__‘:
    # p=Pool()
    # p.map(main,[i*20 for i in range(3)])
    for i in range(3):
        main(i*20)

【插入图片,图片结果】

这次没有用多进程来操作,结果慢了很多。。。

昨天和今天的讲解,主要内容还是在于如何对Ajax加载的内容进行分析,如何获取json数据。图片的下载前面我们已经有过实战案例了,这里就不在重复写代码了。

希望大家有所收获。

时间: 2024-11-04 17:24:38

爬虫实战【7】Ajax解析续-今日头条图片下载的相关文章

用Ajax爬取今日头条图片

Ajax原理 ? 在用requests抓取页面时,得到的结果可能和浏览器中看到的不一样:在浏览器中可以正常显示的页面数据,但用requests得到的结果并没有.这是因为requests获取的都是原始 HTML文档,而浏览器中页面 则是经过Ajax处理数据后生成的.这些数据可能在HTML文档中,也可能是经过JavaScript和特定算法后生成的. ? 刚开始HTML文档中不包含某些数据,当原始页面加载完后,会向服务器发送Ajax请求获取数据,这些数据被JavaScript处理形成一些新页面. ?

用Ajax爬取今日头条图片集

Ajax原理 ? 在用requests抓取页面时,得到的结果可能和浏览器中看到的不一样:在浏览器中可以正常显示的页面数据,但用requests得到的结果并没有.这是因为requests获取的都是原始 HTML文档,而浏览器中页面 则是经过Ajax处理数据后生成的.这些数据可能在HTML文档中,也可能是经过JavaScript和特定算法后生成的. ? 刚开始HTML文档中不包含某些数据,当原始页面加载完后,会向服务器发送Ajax请求获取数据,这些数据被JavaScript处理形成一些新页面. ?

【Python3网络爬虫开发实战】 分析Ajax爬取今日头条街拍美图

前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:haoxuan10 本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 准备工作在本节开始之前,请确保已经安装好requests库.如果没有安装,可以参考第1章.另外如果你对python的库不是很熟的话,建议先去小编的Python交流.裙 :一久武其而而流

芝麻HTTP:分析Ajax爬取今日头条街拍美图

本节中,我们以今日头条为例来尝试通过分析Ajax请求来抓取网页数据的方法.这次要抓取的目标是今日头条的街拍美图,抓取完成之后,将每组图片分文件夹下载到本地并保存下来. 1. 准备工作 在本节开始之前,请确保已经安装好requests库. 2.实战演练 首先,实现方法get_page()来加载单个Ajax请求的结果.其中唯一变化的参数就是offset,所以我们将它当作参数传递,实现如下: import requests from urllib.parse import urlencode def

Ajax爬取今日头条街拍美图

1.打开今日头条:https://www.toutiao.com 2.搜索街拍 3.检查元素,查看请求发现在URL中每次只有offset发生改变,是一个get请求 1 import requests 2 from urllib.parse import urlencode 3 import os 4 from hashlib import md5 5 from multiprocessing.pool import Pool 6 7 def get_page(offset): 8 params

今日头条视频下载器[android下载源码]

在家无聊,看到赵四大神 写的一个python脚本下载今日头条的工具,最后他还给出了移动端的样子,可惜没有源码,在他的虚心教导下,看完了他的文章,我决定自己撸一个,见笑了: CSDN图片最大值只能传2m,所以用了两张gif图,大家见笑了. 下面说一下具体的实现过程,这一点说实在,基本上是翻译了赵大神 的文章,没啥要说,但是还是记录一下吧. 具体的实现步骤大概可以用下的思路概括: 说得挺高上,其实实现起来还是蛮简单的. 1.分享代码如下,主要是activity的intent配置,这个一般人都知道,我

今日头条图片ajax异步加载爬取,并保存至mongodb,以及代码写法的改进

import requests,time,re,json,pymongofrom urllib.parse import urlencodefrom requests.exceptions import RequestExceptionfrom bs4 import BeautifulSoup as bs #连接mongodbclient = pymongo.MongoClient(host='localhost',port=27017)#指定数据库名称db = client.toutiao #

Python网络爬虫实战(二)数据解析

上一篇说完了如何爬取一个网页,以及爬取中可能遇到的几个问题.那么接下来我们就需要对已经爬取下来的网页进行解析,从中提取出我们想要的数据. 根据爬取下来的数据,我们需要写不同的解析方式,最常见的一般都是HTML数据,也就是网页的源码,还有一些可能是Json数据,Json数据是一种轻量级的数据交换格式,相对来说容易解析,它的格式如下. { "name": "中国", "province": [{ "name": "黑龙江

分析Ajax爬取今日头条街拍美图

1 import os 2 import requests 3 from urllib.parse import urlencode 4 from hashlib import md5 5 from multiprocessing.pool import Pool 6 7 GROUP_START = 1 8 GROUP_END = 5 9 10 def get_page(offset): 11 params = { 12 'offset': offset, 13 'format': 'json'