zoukankan      html  css  js  c++  java
  • 正则+协程--20行代码实现爬取整个网页的图片

    实验分析

    1.下载图片,所以需要文件相关的操作

    2.想要多任务下载,所以用到协程中的gevent模块--gevent.joinall()

    3.因为用到gevent模块,担心有延时操作的话,导入gevent中的monkey模块

    4.想要进行网络请求,并读取内容,需要用到 urllib中的request模块

    5.想要匹配网页源代码中所有的jpg。需要用到正则表达式--- import re

    6.因为是匹配所有的jpg,所以可以用re模块中的findall(),它返回一个列表

    7.通过设置变量递增和遍历列表,可以知道第n个图片对应第n个图片地址

    所有的分析都已经完成就可以尝试去完成

    实现代码:

    import gevent
    import urllib.request
    from gevent import monkey
    import re
    
    monkey.patch_all()
    
    def download_img(img_name,img_url):
        req=urllib.request.urlopen(img_url)
        img_content=req.read()
    
        with open(img_name,"wb")as f:
            f.write(img_content)
    
    
    def main():
        with open("/home/python/Desktop/mxf.html", "rb") as f:
            url_content = f.read().decode("utf-8")
    
        img_url_list = re.findall("http://rpic[^s]*?.jpg", url_content)
    
        x = 0
        for img_url in set(img_url_list):
            g1 = gevent.spawn(download_img, "/home/python/Desktop/斗鱼体育图片/%d.jpg" % x , img_url)
            x += 1
            gevent.joinall([g1])
    
    
    if __name__ == '__main__':
        main()

    实现结果

    总结:本次实现过程中遇到很多问题,发现关于正则的基础知识不是很牢固,下去应该着重练习相关的习题和案例。

  • 相关阅读:
    为什么要使用Handler
    使用Java中的Timer和TimerTask
    Top子句对查询计划的影响
    一个单表死锁的示例
    tracer token 追踪标记
    DDL Trigger
    事物复制的troubleshooting 1
    在分发服务器上查看信息
    将windows 2003 sp2的cluster升级到windows 2008 r2
    DistributionDB过大的原因
  • 原文地址:https://www.cnblogs.com/mengxinfeng/p/12545526.html
Copyright © 2011-2022 走看看