午夜无聊,我用python爬取了整个斗图网站,不服来斗

QQ、微信斗图总是斗不过,索性直接来爬斗图网,我有整个网站的图,不服来斗。

废话不多说,选取的网站为斗图啦,我们先简单来看一下网站的结构

网页信息https://v.qq.com/x/cover/zj37945ba8f1n00.html?ptag=qqbrowser
午夜无聊,我用python爬取了整个斗图网站,不服来斗_第1张图片
从上面这张图我们可以看出,一页有多套图,这个时候我们就要想怎么把每一套图分开存放(后边具体解释)
通过分析,所有信息在页面中都可以拿到,我们就不考虑异步加载,那么要考虑的就是分页问题了,通过点击不同的页面,很容易看清楚分页规则https://v.qq.com/x/cover/zj37945ba8f1n00.html?ptag=qqbrowser
午夜无聊,我用python爬取了整个斗图网站,不服来斗_第2张图片
很容易明白分页URL的构造,图片链接都在源码中,就不做具体说明了明白了这个之后就可以去写代码抓图片了

存图片的思路

因为要把每一套图存入一个文件夹中(os模块),文件夹的命名我就以每一套图的URL的最后的几位数字命名,然后文件从文件路径分隔出最后一个字段命名,具体看下边的截图。
午夜无聊,我用python爬取了整个斗图网站,不服来斗_第3张图片
这些搞明白之后,接下来就是代码了(可以参考我的解析思路,只获取了30页作为测试)全部源码

# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import os
class doutuSpider(object):
    headers = {
        "user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"}
    def get_url(self,url):
        data = requests.get(url, headers=self.headers)
        soup = BeautifulSoup(data.content,'lxml')
        totals = soup.findAll("a", {"class": "list-group-item"})
        for one in totals:
            sub_url = one.get('href')
            global path
            path = 'J:\\train\\image'+'\\'+sub_url.split('/')[-1]
            os.mkdir(path)
            try:
                self.get_img_url(sub_url)
            except:
                pass

    def get_img_url(self,url):
        data = requests.get(url,headers = self.headers)
        soup = BeautifulSoup(data.content, 'lxml')
        totals = soup.find_all('div',{'class':'artile_des'})
        for one in totals:
            img = one.find('img')
            try:
                sub_url = img.get('src')
            except:
                pass
            finally:
                urls = 'http:' + sub_url
            try:
                self.get_img(urls)
            except:
                pass
    def get_img(self,url):
        filename = url.split('/')[-1]
        global path
        img_path = path+'\\'+filename
        img = requests.get(url,headers=self.headers)
        try:
            with open(img_path,'wb') as f:
                f.write(img.content)
        except:
            pass
    def create(self):
        for count in range(1, 31):
            url = 'https://www.doutula.com/article/list/?page={}'.format(count)
            print '开始下载第{}页'.format(count)
            self.get_url(url)
if __name__ == '__main__':
    doutu = doutuSpider()
    doutu.create()
复制代码

结果
午夜无聊,我用python爬取了整个斗图网站,不服来斗_第4张图片
午夜无聊,我用python爬取了整个斗图网站,不服来斗_第5张图片
午夜无聊,我用python爬取了整个斗图网站,不服来斗_第6张图片
总结

总的来说,这个网站结构相对来说不是很复杂,大家可以参考一下,爬一些有趣的

你可能感兴趣的:(python)