Python爬虫入门-scrapy爬取唯一图库高清壁纸

2017-09-23  本文已影响243人  小小佐

首先,就是进入到唯一图库,点击上面的高清壁纸项目:

分析-00.png

进入之后,下拉,发现是正常的下拉没有Ajax加载,拉到最后面点击末页,可以看出这个栏目里面总共有292页:

分析-01.png

翻页看一下URL有什么变化,可以发现只有最后面代表这个页码的数字在发生变化:

分析-02.png

打开F12,刷新,在原始请求代码里面有能进入到进入详情页的链接地址,可以抓取下来:

分析-03.png

打开任意一张图片,进入到详情页码中,同样的F12,再刷新页面,里面有几个重要的信息我们要进行提取的,一个就是详情页的总页数,一个是标题,还有一个就是原图的下载地址,在原始请求的源代码中同样也能够找到相应的信息:

分析-04.png
分析-05.png

这里面还有分两种情况,一种就是总页数为一张的就不需要进行翻页,而对于总也是大于一张的图片就要再进行遍历,可以发现翻页时URL会发生变化:
http://www.mmonly.cc/gqbz/dmbz/xxxxx_i.html

经过分析以后就可以写代码了:

mmonly.py:

import scrapy
from scrapy.http import Request
from weiyiwang.items import WeiyiwangItem

class MmonlySpider(scrapy.Spider):
    name = 'mmonly'
    allowed_domains = ['mmonly.cc']
    start_urls = ['http://www.mmonly.cc/gqbz/list_41_{}.html'.format(i) for i in range(1,293)]

    def parse(self, response):
        links=response.css('.item.masonry_brick.masonry-brick')
        for link in links:
            detail_url = link.css('.ABox a::attr(href)').extract_first()
            pages=link.css('.items_likes::text').re_first('共(.*)张')
            if pages==1:
                url=detail_url
                yield Request(url=url, callback=self.parse_detail)
            else:
                for i in range(1,int(pages)):
                    url=detail_url.split('.html')[0]+'_{}.html'.format(i)
                    yield Request(url=url,callback=self.parse_detail)

    def parse_detail(self,response):
        item=WeiyiwangItem()
        item['title']=response.css('.wrapper.clearfix.imgtitle h1::text').extract_first()
        item['img_url']=response.css('.big-pic a img::attr(src)').extract_first()
        yield item

最后的结果是存储至Mongodb:

pipeline.py:

import pymongo
class MongoPipeline(object):
    def __init__(self,mongo_uri,mongo_db):
        self.mongo_uri=mongo_uri
        self.mongo_db=mongo_db

    @classmethod
    def from_crawler(cls,crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DB')
        )
    def open_spider(self,spider):
        self.client=pymongo.MongoClient(self.mongo_uri)
        self.db=self.client[self.mongo_db]

    def close_spider(self,spider):
        self.client.close()

    def process_item(self, item, spider):
        self.db['weiyi'].insert(dict(item))
        return item
分析-06.png
上一篇 下一篇

猜你喜欢

热点阅读