美文网首页Python和爬虫python加油站python爬虫
Python爬虫系列(三)多线程爬取斗图网站(皮皮虾,我们上车)

Python爬虫系列(三)多线程爬取斗图网站(皮皮虾,我们上车)

作者: 致Great | 来源:发表于2017-04-20 19:14 被阅读1660次
    斗图我不怕

    最近看了Python多线程的相关内容,并且前几天观看了腾讯课堂潭州学院上面的关于斗图网爬取的公开课,课程内容大致是利用Python多线程爬取斗图(多页),并将图片保存到本地。自己写这篇文章总结下这个项目的所涉及的知识,并将实现过程分享给大家。

    首先:分析网站,找到图片的src地址

    打开网址:https://www.doutula.com/article/list/?page=1,从网址,我们可以推断出page={页码数字}是为了控制分页。

    在每一中,我们可以看到大致有10个套图(套图点击之后是套图里面的具体图片,大致每个套图里有9张表情图),分别放在class为.list-group-item的a标签里,详情如下面的两张图片:

    套图位置 每页10个套图a标签

    点击一个套图连接之后,我们可以看到套图下的所有图片,然后选择一张图片观察它的src地址,后来发现就是img的属性 onerror的内容(至于为什么不是img下的src,大家可以访问地址试下)

    onerror属性 img的src地址

    其次:爬取思路(关键)

    在第一步分析网站准备工作之后,我们思考下:怎么实现多页爬取?怎么获取每一页所有套图的连接?怎么获取每一套图里面所有表情图片的src?最后怎么实现多线程爬取(加快速度)?为了实现思路清晰,我们将每个模块封装成函数,下面相关代码模块:

    (我还不知道简书怎么加入代码框,有没有大佬可以告诉我)

    引入模块

    (1)获取一个网页的源码

    url地址是指每一页的地址,等会用format函数传递页码,实现多页爬取

    获取一页的源码

    (2)获取每一页的所有套图的链接,利用套图链接去获取所有套图详情网页源码(有点绕)

    获取带有图片的源码

    (3)利用xpath获取每一个图片的带有src地址的onerror属性内容

    图片所在div 获取onerror内容

    这里解释下这段代码:一页中有10个套图,然后每个套图中有9个图片,所以我们在这里获得的items有90个(图片所在的div),然后我们在每一个items中获取onerror里的内容,以便(4)步中的start_save_img()调用

    (4)利用正则获取onerror内容里的图片src地址,然后用多线程实现下载图片

    多线程下载图片

    首先解释下 start_save_img(imgurl_list):参数 imgurl_list是我们(3)中获得onerror的内容(注意:不是图片的src地址,我们还要用注册和切片处理下)。其中我们在for循环中创建一个线程,调用的方法是save_img,传递的参数是onerror

    save_img(img_url):接到onerror,用正则和切片处理后获得到每个图片的src地址,最后保存到本地,% img_url.split('/')[-1]这个事命名方式,大家可以仔细观察下每个图片得src地址最一个/后的内容不一样(这里大家也可以用其他方式命名)

    (5)调用方法执行

    多页(1-7)爬取

    最后:运行代码,效果如下:

    运行效果(我用的校园网)

    总结:这个小项目其实用到很多Python爬虫的知识,并且涉及到多线程,爬取速度还算可以。代码都会写,还是希望自己可以掌握这些方法,下次拿到别的网站自己也会有大致思路了。(ps:如果我有的地方写的不对后者解释不当,请大家海涵和留言指出)

    (ps:源码的话,建议先按图片敲一遍,动手实践下,好处我不说了。或者可以留言邮箱,我发给大家)

    相关文章

      网友评论

      • 555da7704184:楼主可不可以发源码给我呢 这个邮箱1445964932@qq.com 谢谢啦
        致Great:@rhzzrh 你去这里下载吧
        致Great:@rhzzrh https://github.com/yanqiangmiffy/doutu
      • 54d7ffabb63a:有收获 感谢 就是在第二步出了好多问题。。
        54d7ffabb63a:@致Great 是第二段 img_html+=imgl+html return img_html是这段。。
        致Great:@石洋洋 不用return,直接get_html(htm)
        54d7ffabb63a:一直 只能获取 第一个的套图地址 , soup哪里没问题 调试的时候可以显示所有地址 ,但是一旦加上 get_html() return后 就只显示一个了。。
      • 美酒就花生:不太理解这个多线程是怎么运行?同时获取多个嘛?
        致Great:@Azure_9ca9 就是(4)那里多线程下载图片。因为一页中有很多图片,不用一张下载完再去下载第二张
      • Mr_Normal:用markdown
        ```
        print("this is a code block")
        ```
        致Great:@tobegreat 好的👌🏻

      本文标题:Python爬虫系列(三)多线程爬取斗图网站(皮皮虾,我们上车)

      本文链接:https://www.haomeiwen.com/subject/kbblzttx.html