通过正则表达式获取糗事百科上热图模块的图片数据
目标
分页爬取到糗事百科上热图模块的所有图片数据
数据分析
聚焦爬虫:爬取页面中指定的页面内容
编码流程
- 指定url
- 发起请求
- 获取响应数据
- 数据解析
- 持久化存储
数据解析分类
- 正则表达式
- bs4
- xpath
数据解析原理概述:
解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储
1.进行指定标签的定位
2.标签或者标签对应的属性中存储的数据值进行提取(解析)
正则表达式
- 正则表达式
单字符:
. : 除换行以外所有字符
[]: [aoe] [a-w] 匹配集合中任意一个字符
\d: 数字 [0-9]
\D: 非数字
\w: 数字、字母、下划线、中文
\W: 非\w
\s: 所有空白字符包括空格、制表符、换页符等等。等价于 [\f\n\r\t\v]
数量修饰:
* : 任意多次 >=0
+ : 至少一次 >=1
? : 可有可无 0||1
{m}: 固定m次
{m,}: 至少m次
{m,n}: m-n次
边界:
$ : 以某某结尾
^ : 以某某开头
分组:
(ab)
贪婪模式: .*
非贪婪模式: .*?
re.I : 忽略大小写
re.M : 多行匹配
re.S : 单行匹配
re.sub(正则表达式,替换内容,字符串)
准备工作
https://www.qiushibaike.com/imgrank/page/2/ 分析得出该网站中通过page/%d这个数字控制页数,每一页获取静态数据,数据中图片为静态链接。
分析的在这个class名为thumb的div下的每个img元素为每张图片的链接位置。
确定正则表达式:
ex = '<div class="thumb">.*?<img src="(.*?)" alt=".*?'
代码
import requests
import re
import os
if __name__ == '__main__':
#创建图片存储文件夹
if not os.path.exists('./get_img'):
os.mkdir('./get_img')
#设置url
url = 'https://www.qiushibaike.com/imgrank/page/%d/'
# UA伪装:将对应的User-Agent
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36'
}
#正则表达式
ex = '<div class="thumb">.*?<img src="(.*?)" alt=".*?'
#图片序号
cnt = 0
#图片前两页图片
for page_num in range(1,3):
#根据页面设置url
new_url = format(url%page_num)
#获取文本数据
page_text = requests.get(url=new_url, headers=headers).text
# print(page_text)
#正则表达式将所有图片的url取出
image_list = re.findall(ex, page_text, re.S)
# print(image_list)
for img_src in image_list:
cnt = cnt + 1
img_src = 'https:' + img_src
# conten 返回的是二进制形式的图片数据
# text (字符串) content (二进制) json() (对象)
img_data = requests.get(url=img_src, headers=headers).content
#设置存储路径
img_path = './get_img/' + str(cnt) + '.jpg'
with open(img_path, 'wb') as fp:
fp.write(img_data)
print("success!!")