写点什么

技术圈的【多肉小达人】,一篇文章你就能做到

发布于: 3 小时前

20 行代码,变身技术圈多肉小达人


本篇博客目标

爬取目标



使用框架


  • requests,re

  • 有读者说,为啥不用爬虫其它高级一些的框架呢?答:因为是爬虫 120 例系列专栏,由浅入深,目前仅进行到第 5 篇。


重点学习内容


  • get 请求;

  • 双进程爬取,一进程抓取 1-25 页,一进程抓取 26-55 页;

  • 图片编号命名


列表页与详情页分析


  • 分页数据标识明显,可以直接读取总页数;

  • 详情页链接可直接获取。




详情页存在多图情况,具体如下所示,爬取过程中,需要对图片进行编号命名。例如 白凤多肉出 1.png,白凤多肉出 2.png。


编码时间

第一步,获取列表页中的详情页地址。


该步骤解决方案与之前的案例一致,获取网页源码,通过正则表达式解析。在解析前可以先通过字符串截取,获取目标区域的 HTML 代码。


import requestsimport 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 = '<ul class="list2">' end = '<ul class="pagination">'
html = html[res.text.find(start):res.text.find(end)] pattern = re.compile( '<h3><a href="(.*?)" target="_blank" title="(.*?)">.*?</a></h3>') 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(        '<img  alt=".*?" src="(.*?)">')    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


发布于: 3 小时前阅读数: 3
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
技术圈的【多肉小达人】,一篇文章你就能做到