scrapy爬虫-美图录

最近写了个爬虫练练手,爬取的网站为美图录。这次爬取的是美图录里气质这一个模块,如果想爬取其他模块,可以把url地址自行修改。

403服务器错误

当爬取完数据,获取到图片的链接时,直接请求图片的链接会出现403的错误,提示没有权限。出现这个问题时,首先尝试了用selenium来进行测试,发现直接请求是不可以的。然后之前有了解到不少的网站有referer防盗链的设置,然后也通过网上搜寻相关的资料,在测试的时候把请求头给带上,然后成功获取到信息。
在这里插入图片描述
如图所示403错误。
在这里插入图片描述
这是没有添加referer时请求回来的信息。
在这里插入图片描述
在添加了referer之后,返回了大量信息,可见请求成功。

爬虫运行假死

在下载图片的过程中,爬虫发生了假死的现象,主要的原因是请求图片的时候没有加入timeout的设置,一直在请求某个图片链接而发生了卡在那里的现象,加入了timeout之后假死超过一定时间就可以重新请求,同时可以设置重新请求的次数。

爬虫部分代码

    def detail_parse(self,response):
        #翻页之后获取item,同一个套图的图片用一个imgs来进行存储,因为需要referer的url所以需要把每个大页面的url进行存储
        item = response.meta["item"]
        try:
            imgs = response.meta["imgs"]
        except:
            imgs = []
        try:
            r_urls = response.meta["r_urls"]
        except:
            r_urls = []
        images = response.xpath("//div[@class='content']/center/img")
        for img in images:
            a = img.xpath("./@src").extract_first()
            imgs.append(a)
        item["image_urls"] = imgs
        urls = response.xpath("//div[@id='pages']/a")
        for url in urls:
            if url.xpath("./text()").extract_first() == "下一页":
                next_url = url.xpath("./@href").extract_first()
        r_urls.append(response.url)
        item["refer_urls"] = r_urls
        #翻页处理,美图录的下一页在最后一页还是存在的,而且最后一页的下一页url与最后一页的url相同,
        这里进行了一个判断,如果爬取到了最后一页就把item交给pipeline进行处理
        if next_url is not None:
            next_url = urllib.parse.urljoin(response.url,next_url)
            if next_url != response.url:
                yield scrapy.Request(
                    next_url,
                    callback=self.detail_parse,
                    meta={"item":item,"imgs":imgs,"r_urls":r_urls}
                )
            else:
                yield item

pipelines的部分代码

在这里插入图片描述
判断部分有点冗长就没贴个图好了

settings的相关设置

#MongoDB的连接
MONGO_URI = 'localhost'
MONGO_DB = 'meitulu'

#redis的连接
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
REDIS_URL = "redis://:root@127.0.0.1:6379"

#爬取的最大页数
MAX_PAGE = 5

#开启pipelines对数据进行处理
ITEM_PIPELINES = {
   'meitulu.pipelines.images_download': 301,
   'meitulu.pipelines.MongoPipeline': 300,

}

效果

在这里插入图片描述

完整代码

我把完整代码放在了github上,有需要的可以自行观看
https://github.com/gravf/python-webspider/tree/master/meitulu

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值