话不多说,直接开始,直接放上整个程序过程

1、创建工程和生成spiders就不用说了,会用scrapy的都知道。

2、items.py

import scrapy
class HarryItem(scrapy.Item):
    # define the fields for your item here like:
    img_url = scrapy.Field()

 

3、pipelines.py

from scrapy.pipelines.images import ImagesPipeline
from scrapy import Request
class HarryPipeline(object):
    def process_item(self, item, spider):
        return item
class HarryDownLoadPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        for imgurl in item['img_url']:
            yield Request(imgurl)

 

4、settings.py

BOT_NAME = 'harry'
SPIDER_MODULES = ['harry.spiders']
NEWSPIDER_MODULE = 'harry.spiders'
ROBOTSTXT_OBEY = False
IMAGES_URLS_FIELD = "img_url"  # 对应item里面设定的字段,取到图片的url
IMAGES_STORE = 'E:/harrypotter'
ITEM_PIPELINES = {
    'harry.pipelines.HarryDownLoadPipeline': 300,
}

 

5、最主要的爬虫组件hr.py

# -*- coding: utf-8 -*-
import scrapy
from  harry.items import HarryItem
from scrapy import Request

class HrSpider(scrapy.Spider):
    name = 'hr'
    allowed_domains = ['www.ivsky.com']
    sts=[]
    st='http://www.ivsky.com/bizhi/harry_potter5_v3477/pic_1018'
    for x in range(6,24):
        if x<10:
            sts.append(st+'0'+str(x)+'.html')
        else:
            sts.append(st+str(x)+'.html')
    start_urls = sts

    def parse(self, response):
        item=HarryItem()
        urls=response.xpath('//div[@id="pic_con"]/div/img[@id="imgis"]/@src').extract()
        print ('links is :--','\n',urls)
        item['img_url']=urls
        yield item

 

6、执行爬虫

  进入到工程路径,比如我的是harry这个路径中,执行 scrapy crawl hr     #hr 是我设置的爬虫名称

7、总结

  此次爬虫,有两方面的小收获。 收获①这个网站的网页设置很奇怪,用google浏览器F12打开看到图片链接结构是div/div/a/img/@src,但用 这个结构去爬取,发现链接都是空的(这也就是我的spiders中故意设置一  行print (‘links is :–‘,’\n’,urls)的原因了,可以看到爬取过程的log,图片链接有没有正常爬取到)。所以直接邮件查看网页源代码,发现了猫腻,以下两张图片做对比可以发现实际只有div/div/img/@src这个结构才能真正获取到图片链接。怀疑是网站的程序猿将tag搞错<img> 和</a>配对了,在“查看网页源代码”可以看到是这样。

图片一:F12查看的结构

图片二、右键“查看网页源代码”

 

   收获②

如果有些网页是类似下面数字翻页的,而且下一页中的链接不容易提取到的,那么可以用以下将要爬取的图片页面链接全部放置在start_urls这个list中
www.ivsky.com/bizhi/harry_potter5_v3477/pic_101808.html
www.ivsky.com/bizhi/harry_potter5_v3477/pic_101809.html
www.ivsky.com/bizhi/harry_potter5_v3477/pic_101811.html

class HrSpider(scrapy.Spider):
    name = 'hr'
    allowed_domains = ['www.ivsky.com']
    sts=[]
    st='http://www.ivsky.com/bizhi/harry_potter5_v3477/pic_1018'
    for x in range(6,24):
        if x<10:
            sts.append(st+'0'+str(x)+'.html')
        else:
            sts.append(st+str(x)+'.html')
    start_urls = sts

 

欢迎大家留言讨论scrapy

 

posted on 2018-12-26 16:49 pantaQ 阅读() 评论() 编辑 收藏
版权声明:本文为mrtop原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/mrtop/p/10180072.html