爬虫实战练习(一)

爬取糗事百科中的图片

一、运用知识点

正则表达式解析数据

二、思路

  1. 请求糗事百科中的网页数据,数据中含有图片
  2. 利用正则表达式将目标数据提取出来,得到图片的链接列表
  3. 根据图片的链接列表,请求图片数据
  4. 将图片数据存入到文件夹中
  5. 分析不同页面的url,请求多个页面的数据并存储

三、代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# 爬取糗事百科中的图片

import requests
import os
import re

def get_header():
'''
获取headers
:return: headers
'''
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36",
'Content-Type': 'application/json; charset=utf-8'
}
return headers

def page_deal():
'''
分页处理
:return: url_list ,含每页的url地址
'''
# 定义一个通用url模板
model_url = "https://www.qiushibaike.com/imgrank/page/%d/"
# 定义要爬取的页数范围,表示第1页到第n页
n = 2
# 定义一个url存放列表
url_list = []
# 将每页url地址存放在url_list中
for pageNum in range(1, n + 1):
real_url = format(model_url % pageNum)
url_list.append(real_url)
return url_list

def save_location():
'''
创建文件夹,用于保存图片
:return:
'''
if not os.path.exists('./qiutu'):
os.mkdir('./qiutu')

def get_page_data(url_list):
'''
读取每页的数据
:param url_list:
:return:
'''
for page_url in url_list:
# 请求网页数据
response = requests.get(page_url, get_header()).text
# 用正则表达式提取图片路径
ex= r'<div class="thumb">.*?<img src="(.*?)" alt=.*?</div>'
# 查找出全部符合正则的数据,re.S 即为' . '并且包括换行符在内的任意字符(' . '不包括换行符)
img_list = re.findall(ex, response, re.S)
return img_list

def deal_page_data(img_list):
'''
处理每页数据并保存
:param img_list:
:return:
'''
for src in img_list:
# 拼接图片url
src = "https:" + src
# 请求图片的二进制数据
img_data = requests.get(url=src, headers=get_header()).content
# 生成图片名称
img_name = src.split('/')[-1]
# 图片存储路径
imgpath = './qiutu/' + img_name
# 进行存储
with open(imgpath, 'wb') as fp:
fp.write(img_data)
print(img_name, '下载成功')

def run_main():
# 创建一个文件夹,保存所有图片
save_location()
# 获取分页url列表
url_list = page_deal()
# 获取每页的数据
img_list = get_page_data(url_list)
# 处理每页数据并保存
deal_page_data(img_list)

if __name__ == '__main__':
run_main()
------------- End -------------