当前位置 博文首页 > 梦想橡皮擦,专栏100例写作模式先行者:技术圈的【多肉小达人】

    梦想橡皮擦,专栏100例写作模式先行者:技术圈的【多肉小达人】

    作者:[db:作者] 时间:2021-08-28 18:42

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

    Python 爬虫 120 例,已完成文章清单

    1. 10 行代码集 2000 张美女图,Python 爬虫 120 例,再上征途
    2. 通过 Python 爬虫,发现 60%女装大佬游走在 cosplay 领域
    3. Python 千猫图,简单技术满足你的收集控
    4. 熊孩子说“你没看过奥特曼”,赶紧用 Python 学习一下,没想到

    本篇博客目标

    爬取目标

    • 植萌网,多肉频道,目标数据源:https://www.zhimengo.com/duoroutu?page=1

    使用框架

    • 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()
    

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

    技术圈的【多肉小达人】,一篇文章你就能做到
    第二步,通过详情页地址获取多肉所有图片,代码编写过程中,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

    测试代码过程中,顺手爬取了 2000+ 的多肉图片,有喜欢的可以直接下载。

    https://download.csdn.net/download/hihell/19666183

    抽奖时间

    上一篇博客中奖者 a1_girlBosen的技术分享栈 抓紧联系擦姐吧。

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

    爬虫 120 例,加速更新中,篇篇抽奖,等不及可以提前购买。

    只要评论数过 100
    随机抽取一名幸运读者
    奖励 29.9 元《Python 游戏世界》 1 折购买券一份,只需 2.99 元

    今天是持续写作的第 165 / 200 天。可以点赞、评论、收藏啦。

    cs
    下一篇:没有了