Python爬虫入门-小试ImagesPipeline爬取pixabay和煎蛋之为什么是‘404’

第一部分、利用ImagesPipeline爬取pixabay里面的美女图

进入pixabay网站在搜索框中输入关键字beauty,并且简化一下URL中的参数:

分析-01.png

尝试进行翻页,可见URL中只有一个参数pagi发生变化:

分析-02.png

随便进入一个页面打开F12,刷新,在原始的请求中有相关进入到详情页面的链接:

分析-03.png

进入到详情页面,同样F12,刷新,在原始请求中也能找到我们最后想要的图片下载链接(注意:此处并非下载的是最最高清的图片,我尝试进行注册以获取最高清图片下载链接,但是注册失败,有兴趣的可以再试试):

分析-05.png

网页结构比较简单,本来觉得可以很快就爬完,没想到这才刚开始我的404之旅:

pixabay.py:

import scrapy
from scrapy.http.request import Request
from pixabayweb.items import PixabaywebItem

class PixabaySpider(scrapy.Spider):
    name = 'pixabay'
    start_urls=['https://pixabay.com/zh/photos/?q=beauty&pagi={}'.format(i)for i in range(1,414)]

    def parse(self, response):
        base_url='https://pixabay.com'
        links=response.xpath('//div[@class="flex_grid credits"]/div[@class="item"]')
        for link in links:
            url=base_url+link.xpath('./a/@href').extract_first()
            yield Request(url=url,callback=self.parse_detail)

    def parse_detail(self,response):
        item=PixabaywebItem()
        item['image_urls']=response.xpath('//*[@id="media_container"]/img/@src').extract_first()
        yield item
settings.py

BOT_NAME = 'pixabayweb'

SPIDER_MODULES = ['pixabayweb.spiders']
NEWSPIDER_MODULE = 'pixabayweb.spiders'

ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY=0.8
COOKIES_ENABLED = False

DEFAULT_REQUEST_HEADERS = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding':'gzip, deflate, sdch, br',
    'Accept-Language':'zh-CN,zh;q=0.8',
    'User-Agent':'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.11 (KHTML like Gecko) Chrome/23.0.1271.95 Safari/537.11',
     'Host':'pixabay.com',
    'Connection':'keep-alive',
    'Upgrade-Insecure-Requests':'1',
    'Cookie':'is_human=1; csrftoken=9pFSFS4w495FfCFC33KecCXC2TLvevvprCs2g3ALaZTQYReQGJ1f8WStRcfndDPU; sessionid="eyJfbGFuZ3VhZ2UiOiJ6aCJ9:1dvDvQ:_DMlwOr3XOGC3i19M_U4BNEvK7U"; img_pp=100; _ga=GA1.2.2001502836.1505890547; _gid=GA1.2.1360455098.1505994393; client_width=1349',
}

ITEM_PIPELINES = {
   # 'pixabayweb.pipelines.PixabaywebPipeline': 300,
    'pixabayweb.pipelines.MyImagePipeline':1
}
IMAGES_STORE='E:\python\Pycharm\pixabayweb'

IMAGES_EXPIRES=90

IMAGES_THUMBS={
    'small':(50,50),
    'big':(200,200),
}
pipelines.py

from scrapy.pipelines.images import ImagesPipeline

headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
}
class MyImagePipeline(ImagesPipeline):

    def get_media_requests(self,item,info):
        yield scrapy.Request(url=item['image_urls'],headers=headers)

    def item_completed(self,results,item,info):
        image_paths=[x['path'] for ok,x in results if ok]
        if not image_paths:
            raise DropItem('Item contains no images')
        return item

一开始出现报错ImportError:cannot import name ‘_win32stadio’.
翻了好多谷歌,最后通过这个解决:

报错-Google-01.png

后面开始出现各种404错误,没有图片下载下来,每一条抓取的结果都是显示为Item contains no images
报错-04.png

搞了一天,实在没有找到原因,我一度怀疑是不是网站的原因,后面在网上提问,感谢简书的kaikai老哥抽时间找出了我代码中存在的问题。
但是404问题还是没有解决,我觉得是不是网站的问题,所以就换另外一个,爬一爬煎蛋网的妹子图…

第二部分、利用ImagesPipeline爬取煎蛋网里面的妹子图

进入到妹子图,网站结构也比较简单,利用URL中的page参数进行翻页,在原始的请求中可以拿到图片的链接:

分析-01.png

于是我开始再次造轮子了:

jiandan.py:

import scrapy
from meizitu.items import MeizituItem

class JiandanSpider(scrapy.Spider):
    name = 'jiandan'
    start_urls = ['http://jandan.net/ooxx/page-{}'.format(i) for i in range(1,146)]

    def parse(self, response):
        item=MeizituItem()
        image_urls=response.css('.commentlist li .row .text p img::attr(src)').extract()
        item['image_urls']=[('http:'+i)for i in image_urls]
        yield item
settings.py:

BOT_NAME = 'meizitu'

SPIDER_MODULES = ['meizitu.spiders']
NEWSPIDER_MODULE = 'meizitu.spiders'

ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 3
COOKIES_ENABLED = False

DEFAULT_REQUEST_HEADERS = {
    'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Encoding':'gzip, deflate, sdch',
    'Accept-Language':'zh-CN,zh;q=0.8',
    'Connection':'keep-alive',
    'Cookie':'__cfduid=d0f8f8aef303ad3b55cd071a426e7a59c1504854664; _ga=GA1.2.986719823.1501079288; _gid=GA1.2.1585289570.1506061387',
     'Host':'jandan.net',
    'Upgrade-Insecure-Requests':'1',
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
}
ITEM_PIPELINES = {
   'meizitu.pipelines.MyImagePipeline': 1,
}
IMAGES_STORE='E:\\Python\pycharm\meizitu\jiandanmeizi'
IMAGES_EXPIRES=90
IMAGES_THUMBS={ 
       'small':(50,50),
       'big':(200,200)
}
pipelines.py:

import scrapy
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline

class MyImagePipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        for image_url in item['image_urls']:
            yield scrapy.Request(image_url)

    def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok,x in results if ok]
        if not image_paths:
            raise DropItem('Item contains no images')
        return item

运行的结果是这样的:同样也是报404,没能把图片下载下来。

报错-01(20170926).png

后面发现两个的报错好像是差不多的,觉得应该是犯了同样的错误,Google、知乎好像也没能找到相关的,最后看了代码尝试进行修改确实有点问题,但是还是不太明天具体原因,等有点思绪了再写一写。

pixabay:

运行-02.png

d976e11090394fdfff663f539abc8a5afc773121.jpg

煎蛋:

正常运行-01(20170926).png

30889cc7ebbcb6f4e59cba4e2007c2c1897180a0.jpg

第三部分

最后想说一说在处理报错上:ValueError:Missing scheme in request url: h 刚开始自己处理这个的方式有点粗暴直接就是加个[ ],也没有多想,后面经过考虑以后才写成写成上面代码中的这样:

image_urls=response.css('.commentlist li .row .text p img::attr(src)').extract()
        item['image_urls']=[('http:'+i)for i in image_urls]
        yield item

pixabay:

运行-03.png

煎蛋:

运行.png

阅读更多
文章标签: 爬虫 python 图片
个人分类: python爬虫
想对作者说点什么? 我来说一句

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

关闭
关闭
关闭