美文网首页
Python爬虫入门-利用scrapy爬取淘女郎照片

Python爬虫入门-利用scrapy爬取淘女郎照片

作者: 小小佐 | 来源:发表于2017-09-28 17:04 被阅读101次

    最近看到有个相对来说比较简单的可以爬取淘女郎的链接地址,它主要可以通过改变URL中page参数来实现翻页。
    我们这个这个链接进入到一个淘女郎的页面,进入相册页面,里面有很多相册,我们打开其中一个,可以发现照片是慢慢加载出来的,打开F12,刷新,过滤出所有的JS请求,然后不断下拉照片,可以发现也不断有一些JS请求加载出来,打开response,可以看到里面返回的是json格式的数据,里面就有我们要获取的图片的链接地址:

    分析-01.png
    分析-02.png

    讲上面几个URL拷贝出来对比一下,并进行简化,可以看出要想得到图片的链接地址,我们就要构造出含有use_id、album_id、page三个重要参数的URL:

    分析-03.png

    我们返回到这个淘女郎有所有相册的这个页面,同样F12、刷新,选中XRH,然后点击下面的翻页,可以看出有相关的请求加载出来,并且在response中有我们想要的album_id:

    分析-04.png

    将请求的URL拷贝下来对比一下,并进行简化,可见要获得所有相册的album_id,我们需要构建出含有user_id和page两个参数的URL(由于还没有想到如何更好的获取这个page,所以在后面我就默认page为1,也就是只获取第一页相册页的内容):

    分析-05.png

    我们再返回起始页,F12、刷新在原始的请求里面就有各个淘女郎的信息,我们可以提取到链接,然后利用正则就可以将user_id提取出来:

    分析-06.png

    下面就可以开始写代码了:

    taobao.py:
    
    from Taonvlang.items import TaonvlangItem
    from bs4 import BeautifulSoup
    import re
    import json
    
    class TaobaoSpider(scrapy.Spider):
        Num=1
        name = 'taobao'
        # allowed_domains = ['www.taobao.com']
    
        def start_requests(self):
            urls=['https://mm.taobao.com/json/request_top_list.htm?page={}'.format(i) for i in range(1,2)]
            for url in urls:
                yield scrapy.Request(url,callback=self.parse_user_id)
    
        def parse_user_id(self, response):
            urls=response.css('.list-item .personal-info .pic-word .top a::attr(href)').extract()
            user_ids=[url.split('=')[-1] for url in urls if url]
            for user_id in user_ids:
                url='https://mm.taobao.com/self/album/open_album_list.htm?_charset=utf-8&user_id%20={}&page=1'.format(user_id)
                yield scrapy.Request(url,meta={'user_id':user_id},callback=self.parse_album_id)
    
        def parse_album_id(self, response):
            user_id=response.meta.get('user_id')
            if response.status==200:
                html=response.text
                soup=BeautifulSoup(html,'lxml')
                results=soup.select('.mm-photo-list.clearfix .mm-photo-cell')
                for result in results:
                    link=result.select('.mm-photo-cell-middle h4 a')[0]['href']
                    album_id=re.search('album_id=(.*?)&',link).group(1)
                    page_content=result.select('.mm-photo-cell-middle .mm-pic-number')[0].text
                    pages=int(re.findall('\d+',page_content)[0])
                    for page in range(1,int(pages/16)+2):
                        print('开始处理用户:{},相册编号:{},第{}页,#{}'.format(user_id,album_id,page,self.Num))
                        self.Num=self.Num+1
                        url='https://mm.taobao.com/album/json/get_album_photo_list.htm?user_id='+str(user_id)+'&album_id='+str(album_id)+'&page='+str(page)
                        yield scrapy.Request(url,callback=self.parse)
    
        def parse(self,response):
            item=TaonvlangItem()
            html=response.text
            contents=json.loads(html)
            piclists=contents.get('picList')
            for piclist in piclists:
                item['user_id'] = piclist.get('userId')
                item['album_id'] = piclist.get('albumId')
                item['title']=piclist.get('des')
                item['picurl']='http:'+piclist.get('picUrl').replace('_290x10000','_620x10000')
                yield item
    
    settings.py:
    
    BOT_NAME = 'Taonvlang'
    
    SPIDER_MODULES = ['Taonvlang.spiders']
    NEWSPIDER_MODULE = 'Taonvlang.spiders'
    
    MONGO_URI='localhost'
    MONGO_DB='taonvlang'
    
    ROBOTSTXT_OBEY = False
    DOWNLOAD_DELAY = 0.5
    COOKIES_ENABLED = False
    
    DEFAULT_REQUEST_HEADERS = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'en',
        'user-agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
        'cookie':'tracknick=tb4192332_2012; _cc_=U%2BGCWk%2F7og%3D%3D; tg=0; UM_distinctid=15dbfe52514207-04b2f5bc0dad73-5c6a3a7a-100200-15dbfe52516189; miid=1819893462062305719; hng=CN%7Czh-CN%7CCNY%7C156; thw=cn; x=e%3D1%26p%3D*%26s%3D0%26c%3D0%26f%3D0%26g%3D0%26t%3D0%26__ll%3D-1%26_ato%3D0; CNZZDATA30063598=cnzz_eid%3D1240630502-1506404882-https%253A%252F%252Fmm.taobao.com%252F%26ntime%3D1506410623; mt=ci%3D-1_0; v=0; cookie2=1f2c6d580c0f148fbc23e44a72de8f8f; t=161b12068ebd1c81ad307468bd85c61c; _tb_token_=51e38b59445f8; CNZZDATA30064598=cnzz_eid%3D1465862291-1506410103-https%253A%252F%252Fmm.taobao.com%252F%26ntime%3D1506497588; CNZZDATA30063600=cnzz_eid%3D657822935-1506407601-https%253A%252F%252Fmm.taobao.com%252F%26ntime%3D1506497588; cna=KHPKEQF/owQCAd5P091TEN2z; isg=AqWlkF1UEG9PMHRxJxBdyAqptGGxCilIDLs31KeKYVzrvsUwbzJpRDNePhQz; JSESSIONID=94615D4E06F9128BD591C9C4B3A69B13; uc1=cookie14=UoTcCfQsoQo68g%3D%3D'
    }
    
    ITEM_PIPELINES = {
        'Taonvlang.pipelines.MyImagesPipeline':1,
       'Taonvlang.pipelines.MongoPipeline': 300,
    }
    
    IMAGES_STORE='E:\python\Pycharm\Taonvlang'
    IMAGES_EXPIRES=90
    
    IMAGES_THUMBS={
        'small':(50,50),
        'big':(200,200),
    }
    

    这个是最终的运行结果:

    运行-01.png

    这是下载下来的淘女郎的照片(此处若有涉及侵权我将第一时间删除):

    000be1f0aa019cbe8e92869a5c03df3aca5cb99d.jpg 0b05048c75b5adb2061d303092e84504fe73a0a7.jpg

    存在的问题:
    1、代码中有好几个地方还是可以再完善一下的
    2、写代码中还是会出现卡壳的情况,有些地方还不是运用的很熟练
    3、还是要多学新知识、运用新知识来解决问题

    相关文章

      网友评论

          本文标题:Python爬虫入门-利用scrapy爬取淘女郎照片

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