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

最近看到有个相对来说比较简单的可以爬取淘女郎的链接地址,它主要可以通过改变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、还是要多学新知识、运用新知识来解决问题

阅读更多
换一批

没有更多推荐了,返回首页