scrapy爬虫,爬取图片

1、scrapy的安装:html

本文基于Anacoda3,python

Anacoda2和3如何同时安装?网络

将Anacoda3安装在C:\ProgramData\Anaconda2\envs文件夹中便可。dom

如何用conda安装scrapy?scrapy

安装了Anaconda2和3后,ide

 

 

如图,只有一个命令框,能够看到打开的时候:url

 

 

能够切到Anaconda3对应的路径下便可。spa

安装的方法:cmd中:conda install scrapy便可。htm

固然,可能会出现权限的问题,那是由于安装的文件夹禁止了读写。能够如图:blog

将权限都设为“容许“。

注意:此时虽然scapy安装上了,可是在cmd中输入scapy可能会不认,能够将安装scrapy.exe的路径添加到环境变量中。

 

2、scapy的简单使用

例子:爬取图片

一、 建立scrapy工程

譬如,想要建立工程名:testImage

输入:scrapy startproject testImage

便可建立该工程,按照cmd中提示的依次输入:

cd testImage

scrapy genspider getPhoto www.27270.com/word/dongwushijie/2013/4850.html

其中:在当前项目中建立spider,这仅仅是建立spider的一种快捷方法,该方法可使用提早定义好的模板来生成spider,后面的网址是一个采集网址的集合,即为容许访问域名的一个判断。注意不要加http/https。

 

至此,能够在testImage\testImage\spiders中找到建立好的爬虫getPhoto.py,能够在此基础上进行修改。

二、建立爬虫

如图,能够在图片的位置右键,检查,查看源码,在图片所在的位置处,将xpath拷贝出来。

此时,能够找出图片的地址:

class GetphotoSpider(scrapy.Spider):
    name = 'getPhoto'
    allowed_domains = ['www.27270.com']
    start_urls = ['http://www.27270.com/word/dongwushijie/2013/4850.html']
    def parse(self, response):
        urlImage = response.xpath('//*[@id="picBody"]/p/a[1]/img/@src').extract()
        print(urlImage)
        pass

  

此时,注意网络路径的正确书写,最后没有/,

http://www.27270.com/word/dongwushijie/2013/4850.html/   

此时将4850.html 看成了目录,会出现404找不到路径的错误!

三、 下载图片

items.py:

class PhotoItem(scrapy.Item):
    name = scrapy.Field()
    imageLink = scrapy.Field()

pipelines.py:

from scrapy.pipelines.images import ImagesPipeline
import scrapy
class ImagePipeline(ImagesPipeline):
    def get_media_requests(self,item,info):
        image_link = item['imageLink']
        yield scrapy.Request(image_link)

  

settings.py:

IMAGES_STORE = r"C:\Users\24630\Desktop\test"

另外,对于上面的网址,还须要ROBOTSTXT_OBEY = False

而且,访问该网址会出现302错误,这是一个重定向的问题,

MEDIA_ALLOW_REDIRECTS =True

设置该选项,就能够正确下载,可是下载的仍是不对,问题很差解决。

固然在爬虫中,还要对items赋值:

from testImage import items
。。。

for urllink in urlImage:
      item = items.PhotoItem()
      item['imageLink'] = urllink

  

3、 进一步爬取(读取下一页)

# -*- coding: utf-8 -*-
import scrapy
from testImage import items
class GetphotoSpider(scrapy.Spider):
    name = 'getPhoto'
    allowed_domains = ['www.wmpic.me']
    start_urls = ['http://www.wmpic.me/93912']
    def parse(self, response):
        #//*[@id="content"]/div[1]/p/a[2]/img
        urlImage = response.xpath('//*[@id="content"]/div[1]/p/a/img/@src').extract()
        print(urlImage)
        for urllink in urlImage:
            item = items.PhotoItem()
            item['imageLink'] = urllink            
            yield item
            
            
        ifnext  = response.xpath('//*[@id="content"]/div[2]/text()').extract()[0] 
        # 当没有下一篇,即最后一页中止爬取
        if("下一篇" in ifnext):
            nextUrl = response.xpath('//*[@id="content"]/div[2]/a/@href').extract()[0]
            url=response.urljoin(nextUrl)
            yield scrapy.Request(url=url)

  此时,即可以看到路径下的下载后的文件了。(因为该网址每页的图片所在的xpath都不同,故下载的图片不全)