我又来了,今天开启聚焦爬虫!
-
什么是聚焦爬虫?
聚焦爬虫是用来爬取页面特定局部信息的 -
聚焦爬虫与通用爬虫的区别与联系?
聚焦爬虫用来爬取页面特定局部信息
通用爬虫是用来爬取页面的一整面信息
先爬一整面,再爬局部,爬取页面中指定的页面内容 -
聚焦爬虫如何使用?
-编码流程:
-1.指定URL
-2.发起请求
-3.获取响应数据
-4.数据解析
-5.持久化存储-三种解析方式:
-1.正则表达式
-2.bs4
-3.xpath(最常用 -
数据解析原理:
解析的局部文本内容都会在标签之间或标签对应的属性中存储。
-1.进行指定标签定位
-2.标签或者标签对应属性中存储的数据值进行提取(解析)
first.正则解析
这里用正则解析方法爬取糗事百科网站上的图片,网址(URL):https://www.qiushibaike.com/imgrank/
首先打开页面的抓包工具,找到我们需要的UA(进行UA伪装🥸
接着,我们需要用正则表达式获取图片的地址,也就是我们进行的聚焦爬虫
查看elements,找到id=content,class=main
在找到图片所在的class
<div class="thumb">
<a href="/article/124058316" target="_blank">
<img src="//pic.qiushibaike.com/system/pictures/12405/124058316/medium/EPNASXE1ZB8VEBTB.jpg" alt="糗事#124058316" class="illustration" width="100%" height="auto">
</a>
</div>
用正则表达式提取图片地址,下面是一步步的获取过程:
1.ex = '<div class="thumb">.*?</div>'这里是正则表达式的非贪婪模式
2.ex = '<div class="thumb">.*?<img src="(.*?) alt.*?</div>'
这里需要注意的是正则表达式的贪婪和非贪婪模式对格式的要求非常严格,这里.jpg"和alt之间有一个空格,如果忘记打上结果就不对了。还有(.*?)的位置也很重要,因为()中的内容会作为捕获组的匹配结果
我们可以先写一个简单的小程序运行一下,把得到的图片地址打印出来。
import re
import requests
if __name__ == "__main__":
headers = {
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'
}
url = 'https://www.qiushibaike.com/imgrank/'
page_text = requests.get(url=url, headers=headers).text
ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
img_src_list = re.findall(ex, page_text, re.S)
print(img_src_list)
测试一下,打印出来的应该是这样
//pic.qiushibaike.com/system/pictures/12405/124058316/medium/EPNASXE1ZB8VEBTB.jpg
(其中一个
这样 我们就完成了对这个页面上的图片的解析提取
下一步,我们需要做的是拼接出完整的图片URL,请求图片数据,给图片命名,最后进行储存就OK啦
这里进行拼接的话,一页上有很多图片,我们不可能一个一个拼接,所以这里需要用for来进行循环,让他来帮助我们完成拼接、请求数据和命名工作。(所以这里觉得循环真的是个好东西,把那些重复性高的工作帮我们很快解决了!
for src in img_src_list:
src = 'https:'+src
#拼接完整的图片url
img_data = requests.get(url=src,headers=headers).content
#请求到图片的二进制数据
img_name = src.split('/')[-1]
#生成图片名称 从原始地址中获取
img_path = './qiutulibs/'+img_name
with open(img_path,'wb')as fp:
fp.write(img_data)
print(img_name,'下载成功!')
这里需要注意的是,由于我们想得到的是图片数据,所以发起请求时的URL不再是原先的URL了,而是我们新生成的图片的地址,也就是src
然后我们拓展一下,加入分页功能,也就是获取多页的图片,通过观察,我们发现第一页第二页第三页甚至第n页的差别:https://www.qiushibaike.com/imgrank/page/1/
是URL的page属性发生了改变
我们通过加入一个URL模版来实现
完整代码:
import requests
import re
import os
#创建文件夹保存图片
if __name__ == '__main__':
if not os.path.exists('./qiutulibs'):
os.mkdir('qiutulibs')
#设置一个通用的url模版
headers = {
'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.146 Safari/537.36'
}
url = 'https://www.qiushibaike.com/imgrank/page/%d/'
#pagenum = 2
for pagenum in range(1,3):
new_url = format(url%pagenum)
#更新页码
#先使用通用爬虫爬取
page_text = requests.get(url=new_url, headers=headers).text
#聚焦爬虫将页面中图片进行解析提取
#提取每个照片的属性值
ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
img_src_list = re.findall(ex,page_text,re.S)
#返回列表
#re.S单行匹配
#print(img_src_list)
for src in img_src_list:
src = 'https:'+src
#拼接完整的图片url
img_data = requests.get(url=src,headers=headers).content
#请求到图片的二进制数据
img_name = src.split('/')[-1]
#生成图片名称 从原始地址中获取
img_path = './qiutulibs/'+img_name
with open(img_path,'wb')as fp:
fp.write(img_data)
print(img_name,'下载成功!')
ps:这里记一个知识点
在发起请求时:
.content返回二进制形式的图片数据
.text返回字符串
.json返回对象形式
因为出去玩了,bs4和xpath的视频还没看完,呜呜呜,明天加油!