昨天又复习了一遍正则,今天继续学爬虫,今天学的是爬取糗事百科页面上的图片。
如何将页面中的图片都爬取下来呢
按下键盘上的F12
使用查看器可以得到,图片的地址在<div class="thumb">之下<img src=" 的后面到 " 结束,所以可以先获取网页数据,然后用正则表达式提取图片的url。
正则的分析:
在字符串中,包含换行符n,在这种情况下:
如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始。
而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,在整体中进行匹配。
以下为代码:
代码语言:javascript复制import requests
import re
if __name__ == '__main__':
# 糗事百科的热图页面url
url = "https://www.qiushibaike.com/imgrank/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0"
}
# 获取页面数据
page_text = requests.get(url=url, headers=headers).text
# 使用正则表达式提取出图片的地址
results = re.findall('<div class="thumb">.*?<img src="(.*?)" alt=.*?</div>', page_text, re.S)
for index, result in enumerate(results): # 使用枚举获得索引
# 拼接图片的url地址
pic_url = "https:" result
# 获取响应数据,由于是图片所以使用content(二进制)
image_data = requests.get(url=pic_url, headers=headers).content
# 存储图片
with open(r"../image/image0{}.jpg".format(index), "wb") as fp:
fp.write(image_data)
print("all done")
完成!但是总感觉有点问题,图片应该不止这么多张
打开查看:
成功。
现在爬取多页数据,当我切换页码h时,可以发现地址栏的变化,即url只有代表页码的数字是变化的。
所以可以升级优化我的代码,将发送url请求放进一个for循环中:
代码语言:javascript复制import requests
import re
if __name__ == '__main__':
# 糗事百科的热图页面url
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0"
}
for page in range(1, 11):
循环获取不同页面的url
url = "https://www.qiushibaike.com/imgrank/page/{}/".format(page)
# 获取页面数据
page_text = requests.get(url=url, headers=headers).text
# 使用正则表达式提取出图片的地址
results = re.findall('<div class="thumb">.*?<img src="(.*?)" alt=.*?</div>', page_text, re.S)
for index, result in enumerate(results): # 使用枚举获得索引
# 拼接图片的url地址
pic_url = "https:" result
# 获取响应数据,使用content保存图片(二进制)
image_data = requests.get(url=pic_url, headers=headers).content # 二进制用content
# 存储图片
with open(r"../image/image0{}.jpg".format(index), "wb") as fp:
fp.write(image_data)
print("all done")
下面都要跟着缩进。