爬虫------图片下载器与 ItemLoader类的封装

1.  分析网站信息

http://www.meizitu.com/

1.1  得到每页每个帖子连接:Xpath规则是://h2/a/@href

1.2得到帖子标签://div[@class='metaRight']/p/text()

1.3得到帖子中的信息得到帖子名称://h2/a/text()

1.4得到图片列表://div[@id="picture"]/p/img/@src

2. 创建项目
创建项目命令:scrapy startproject meizitu
进入目录:cd meizitu
创建爬虫:scrapy genspider meizitu meizitu.com
使用PyCharm打开项目
在项目根目录下新建main.py文件,用于调试:
from scrapy import cmdline

cmdline.execute('scrapy crawl meizi'.split())

3. items.py
# -*- coding: utf-8 -*-
import scrapy
class MeizituItem(scrapy.Item):
    #帖子路径
    url = scrapy.Field()
    #帖子名称
    name = scrapy.Field()
    #帖子标签
    tags = scrapy.Field()
    #帖子里面的图片列表
    image_urls = scrapy.Field()
    #图片存放在本地的路径
    images = scrapy.Field()

4. spiders/coser.py

import scrapy
# Item Loaders提供了一种便捷的方式填充抓取到的 :Items
from scrapy.contrib.loader import ItemLoader, Identity
from meizitu.items import MeizituItem

class MeiziSpider(scrapy.Spider):
    name = "meizi"
    allowed_domains = ["meizitu.com"]
    url = 'http://www.meizitu.com/'
    start_urls = (
        url,
    )
    def parse(self, response):
        #得到每页每个帖子连接,用@href属性
        link_lists = response.xpath('//h2/a/@href').extract()
        for link in link_lists:
            print("link==",link)
            # 请求=Request(连接,parese_item)
            yield scrapy.Request(link, callback=self.parse_item)  # 返回请求
        # 获取页码集合
        # pages = response.xpath('//*[@id="wp_page_numbers"]/ul/li/a/@href').extract()
        # print('pages: %s' % pages)  # 打印页码
        # if len(pages) > 2:  # 如果页码集合>2
        #     page_link = pages[-2]  # 图片连接=读取页码集合的倒数第二个页码
        #     # page_link = page_link.replace('/a/', '')  # 图片连接=page_link(a替换成空)
        #     next_url = self.url+ page_link
        #     print("next_url==",next_url)
        #
        #     yield scrapy.Request(next_url, callback=self.parse)  # 返回请求
    #解析具体的帖子信息
    def parse_item(self, response):
        print("parse_item in url===",response.url)
        # l=用ItemLoader载入MeizituItem()

        item_loader = ItemLoader(item=MeizituItem(), response=response)
        # 名字
        item_loader.add_xpath('name', '//h2/a/text()')
        # 标签
        item_loader.add_xpath('tags', "//div[@class='metaRight']/p/text()")
        # 图片连接
        item_loader.add_xpath('image_urls', "//div[@id='picture']/p/img/@src", Identity())
        # url
        item_loader.add_value('url', response.url)

        return item_loader.load_item()
ItemLoader类的封装

执行新脚本程序

from scrapy import cmdline

cmdline.execute('scrapy crawl meizi -o meizi.json'.split())

扩展支持下一页
# -*- coding: utf-8 -*-
import scrapy
# Item Loaders提供了一种便捷的方式填充抓取到的 :Items
from scrapy.contrib.loader import ItemLoader, Identity
from meizitu.items import MeizituItem

class MeiziSpider(scrapy.Spider):
    name = "meizi"
    allowed_domains = ["meizitu.com"]
    url = 'http://www.meizitu.com/'
    start_urls = (
        url,
    )
    def parse(self, response):
        #得到每页每个帖子连接,用@href属性
        link_lists = response.xpath('//h2/a/@href').extract()
        for link in link_lists:
            print("link==",link)
            # 请求=Request(连接,parese_item)
            yield scrapy.Request(link, callback=self.parse_item)  # 返回请求
        # 实现下一样获取页码集合
        pages = response.xpath('//*[@id="wp_page_numbers"]/ul/li/a/@href').extract()
        print('pages: %s' % pages)  # 打印页码
        for page in pages: 
            next_url = self.url+ page
            yield scrapy.Request(next_url, callback=self.parse)  # 返回请求
    #解析具体的帖子信息
    def parse_item(self, response):
        print("parse_item in url===",response.url)
        # l=用ItemLoader载入MeizituItem()
        item_loader = ItemLoader(item=Meizitu2Item(),response=response)
        #直接只用xpath
        item_loader.add_xpath("title",'//div[@class="metaRight"]/h2/a/text()')
        #如果已经是取到的值了就用add_value
        item_loader.add_value("url",response.url)
        #最后一个参数是返回里面的内容
        item_loader.add_xpath("images", '//div[@id="picture"]/p/img/@src',Identity())
        return item_loader.load_item()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值