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

举报
梦想橡皮擦 发表于 2021/12/09 21:10:49 2021/12/09
【摘要】 20 行代码,变身技术圈多肉小达人 本篇博客目标爬取目标植萌网,多肉频道,目标数据源:https://www.zhimengo.com/duoroutu?page=1使用框架requests,re有读者说,为啥不用爬虫其它高级一些的框架呢?答:因为是爬虫 120 例系列专栏,由浅入深,目前仅进行到第 5 篇。重点学习内容get 请求;双进程爬取,一进程抓取 1-25 页,一进程抓取 26-5...

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

本篇博客目标

爬取目标

使用框架

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

重点学习内容

  • get 请求;
  • 双进程爬取,一进程抓取 1-25 页,一进程抓取 26-55 页;
  • 图片编号命名

列表页与详情页分析

  • 分页数据标识明显,可以直接读取总页数;
  • 详情页链接可直接获取。

详情页存在多图情况,具体如下所示,爬取过程中,需要对图片进行编号命名。例如 白凤多肉出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 = '<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()

运行代码之后,得到如下详情页列表,其中的标题用作后续图片存储使用。

捕获详情页图片地址的代码如下所示,这里经验是使用某固定地址进行正则表达式测试。

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

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。