20 行代码,变身技术圈多肉小达人
爬取目标
使用框架
重点学习内容
列表页与详情页分析
详情页存在多图情况,具体如下所示,爬取过程中,需要对图片进行编号命名。例如 白凤多肉出1.png
,白凤多肉出2.png
。
第一步,获取列表页中的详情页地址。
该步骤解决方案与之前的案例一致,获取网页源码,通过正则表达式解析。在解析前可以先通过字符串截取,获取目标区域的 HTML 代码。
import requests
import re
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36"
}
def get_list():
"""
获取全部详情页链接
"""
all_list = []
res = requests.get(
"https://www.zhimengo.com/duoroutu?page=1", headers=headers)
html = res.text
start = ''
end = ''
html = html[res.text.find(start):res.text.find(end)]
pattern = re.compile(
'.*?
')
all_list = pattern.findall(html)
return all_list
编写 run
函数,调用该函数。
def run():
url_list = get_list()
print(url_list)
if __name__ == "__main__":
run()
运行代码之后,得到如下详情页列表,其中的标题用作后续图片存储使用。
第二步,通过详情页地址获取多肉所有图片,代码编写过程中,Python 请求返回的 HTML 页面数据与开发者工具查看的不一致,以 Python 请求为准,差异如下。该差异最大的影响是正则表达式的书写。
捕获详情页图片地址的代码如下所示,这里经验是使用某固定地址进行正则表达式测试。
def get_detail(title, url):
res = requests.get(url=url, headers=headers)
html = res.text
print(html)
pattern = re.compile(
'
')
imgs = pattern.findall(html)
for index, url in enumerate(imgs):
print(title, index, url)
# save_img(title, index, url)
def run():
url_list = get_list()
# print(url_list)
# for url, title in url_list:
get_detail("粉蔓多肉植物", "https://www.zhimengo.com/duoroutu/24413")
上述代码的 save_img
是保存图片函数,具体代码如下:
def save_img(title, index, url):
try:
img_res = requests.get(url, headers=headers)
img_data = img_res.content
print(f"抓取:{
url}")
with open(f"images/{
title}_{
index}.png", "ab+") as f:
f.write(img_data)
except Exception as e:
print(e)
接下来,继续对代码进行改造,本案例实现 2 个进程的爬虫,即双进程爬取,一进程抓取 1-25 页,一进程抓取 26-55 页。
此处改进的代码主要为 run
函数,具体如下:
def run(start, end):
wait_url = [
f"https://www.zhimengo.com/duoroutu?page={
i}" for i in range(int(start), int(end)+1)]
print(wait_url)
url_list = []
for item in wait_url:
ret = get_list(item)
# print(len(ret))
print(f"已经抓取:{
len(ret)} 条数据")
url_list.extend(ret)
# print(len(url_list))
for url, title in url_list:
get_detail(title, url)
if __name__ == "__main__":
start = input("请输入起始页:")
end = input("请输入结束页:")
run(start, end)
运行程序,依据网速进行测试即可,双进程即启用两次该 Python 脚本,手动进行页码区分即可。
完整代码下载地址:https://codechina.csdn.net/hihell/python120
测试代码过程中,顺手爬取了 2000+ 的多肉图片,有喜欢的可以直接下载。
https://download.csdn.net/download/hihell/19666183
上一篇博客中奖者 a1_girl
和 Bosen的技术分享栈
抓紧联系擦姐吧。
爬虫 120 例,加速更新中,篇篇抽奖,等不及可以提前购买。
只要评论数过 100
随机抽取一名幸运读者
奖励 29.9 元《Python 游戏世界》 1 折购买券一份,只需 2.99 元
今天是持续写作的第 165 / 200 天。可以点赞、评论、收藏啦。