python爬取头条图集_Python爬虫基础练习(六) 今日头条街头篮球图片爬取

今天我们要爬取的仍然是图片,不过与上一篇有所不一样的是,今天爬取的是今日头条上的图集,接着往下看吧~

运行平台:Windows

Python版本:Python3.6

IDE: Sublime Text Python自带IDLE

其他:Chrome浏览器

简述流程为:

步骤1:了解Ajax加载并使用开发者工具找到Ajax加载的数据

步骤2:从网页中获取相关信息

步骤3:解析json信息

步骤4:爬取图片并保存(利用多进程加速)

我们在浏览网页时经常会碰到这样一种情况,原始网页只显示一部分数据,需要手动下拉进度条才会加载出更多内容.并且这种情况下页面链接不改变,现在有很多网页都是使用这种方式呈现数据。这种加载页面的方式其实就是Ajax加载。Ajax加载和我们之前爬取的网页有何不同呢?最大的不同便是我们在浏览器上可以看到的正常显示的数据,却不能被requests给抓取到,所以今天我们需要了解一下怎样应对Ajax的分析与数据采集。

同样我们需要借助Chrome浏览器,我们先来通过浏览器来看一下Ajax加载的实例。今天要爬取的是今日头条的图片,所以我们以今日头条的官网演示,其实还有很多网站是这样加载的,比如微博、空间等。

我们打开今日头条网页,输入街头篮球搜索,然后点击图集,你会看到一系列图集,然后将进度条下拉,内容不断增多,但网页链接却没有改变。我们通过开发者工具来看一下加载过程,按下F12+F5,找到xhr,在我们不断下拉的时候,会发现xhr中的条目逐渐增加,我们点开其中一个

展开data字段,我们便可以看到许多数据,而其中的title正好对应了浏览器上显示的标题,检查其他浏览器上显示的,会发现可以一一对应到,于是我们便找到了这些由Ajax加载的数据,右键查看一下。哈哈哈,再一次展示了JSONView的强大。

接下来我们便可以开始用代码实现了。

首先还是将网页HTML文本爬取下来吧

这里为了方便截图,将函数的文档字符串给删除了,这里文档字符串也就是“获取网页HTML文本并返回结果”。我们主要看一下paras这个字典,这是怎么来的呢?实际上这就是从开发者工具中看到的,也是用来请求URL的各种参数,offset、format等每个参数代表的意思我已经在注释中标明了。

这里的offset为0,表示为加载的第一页,继续下拉会发现,offset以20为等差递增,keyword为我们搜素的关键词,函数中我们将这两个参数以变量形式赋值,便于我们获取到其他更多内容。我们在这里会遇到一个小小的麻烦,就是在将这些请求参数复制下来的时候,需要我们自己去调整成字典的格式,如果一个冒号,引号的加上去也不是不可以,只是显得有些麻烦,我们可以使用编辑器中提供的替换功能。

这里使用的是正则匹配替换,切换正则匹配模式后按下 Replace All便可以将其转换成我们所需要的格式了。

构建网页链接的时候我们使用了urllib.parse库中的urlencode函数,这是将我们所匹配出来的key-value格式的键值对转换成网页所需要的格式,返回的一般是a=1&b=2&c=3这样的字符串,比如说:

我们会发现在浏览器中显示网页链接中的的中文会变成一串看不懂的编码,这其实就是urlencode能够完成的。通过一个简单的例子看一下。

我们可以先将爬取下来的结果打印出来,然后使用在线json解析工具对比一下,便可以发现我们爬取的文本是否正确了。

接下来便是解析文本,提取我们想要的信息了。

这里我们先使用json.loads将HTML文本解析成json格式。这里只是将索引页中显示的标题和图片爬取出来,并没有爬取所有的图片。如果需要爬取所有图片的话,我们需要先获取所有详情页的URL,然后在详情页中使用正则表达式获取所有图片信息,这里就不再叙述了。

因为只是获取标题栏下的图片,所以我们可以对图片链接中的/list/进行替换,使得我们爬取到的图片是大图,而不是标题栏下的那些小图。

同样是将图片存储到文件中,与上一篇一样,创建文件夹并转到文件夹目录中,不过使用标题作为文件名的话,会出现重名,所以我在每个文件后使用数字标明,用于区分。

最后就是传入offset和keyword参数了,这里我只输出第一页的内容。

由于每一张图片存储过后我都休息了两秒,所以即使只爬取一页内容,最后用时也很长,所以我们可以采用多进程的方式,减少用时。

这里我们使用的是Pool类中的map方法,它与内置的map函数方法用法基本一致,它可以使得进程阻塞直到返回结果。 也就是说,当我运行上面这段代码时,它不会像for循环一样,“存储成功”的字眼一个一个输出,而是在程序结束之前一起输出结果。

时间变少了,当然由于街头篮球的图集数量不多,这一次我们也只爬取了24项内容,但速度相对于之前依然快了不少,不要忘了,我们爬取一张图片可都休息了2秒,所以这个速度还是提升了不少的。

最后看下爬取的成果吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值