11、web爬虫讲解2—Scrapy框架爬虫—Scrapy使用

xpath表达式

  //x 表示向下查找n层指定标签,如://div 表示查找所有div标签

  /x 表示向下查找一层指定的标签

  /@x 表示查找指定属性的值,可以连缀如:@id @src

  @属性名称="属性值"表示查找指定属性等于指定值的标签,可以连缀 ,如查找class名称等于指定名称的标签 

  /text() 获取标签文本类容

  x 通过索引获取集合里的指定一个元素

1、将xpath表达式过滤出来的结果进行正则匹配,用正则取最终内容

最后.re('正则')

xpath('//div[@class="showlist"]/li//img')[0].re('alt="(\w+)')

2、在选择器规则里应用正则进行过滤

re:正则规则

xpath('//div[re:test(@class, "showlist")]').extract()

实战使用Scrapy获取一个电商网站的、商品标题、商品链接、和评论数

image

分析源码

image

第一步、编写items.py容器文件

我们已经知道了我们要获取的是、商品标题、商品链接、和评论数

在items.py创建容器接收爬虫获取到的数据

设置爬虫获取到的信息容器类,必须继承scrapy.Item类

scrapy.Field()方法,定义变量用scrapy.Field()方法接收爬虫指定字段的信息

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy

#items.py,文件是专门用于,接收爬虫获取到的数据信息的,就相当于是容器文件

class AdcItem(scrapy.Item):    #设置爬虫获取到的信息容器类
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()      #接收爬虫获取到的title信息
    link = scrapy.Field()       #接收爬虫获取到的连接信息
    comment = scrapy.Field()    #接收爬虫获取到的商品评论数

第二步、编写pach.py爬虫文件

定义爬虫类,必须继承scrapy.Spider

name设置爬虫名称

allowed_domains设置爬取域名

start_urls设置爬取网址

parse(response)爬虫回调函数,接收response,response里是获取到的html数据对象

xpath()过滤器,参数是xpath表达式

extract()获取html数据对象里的数据

yield item 接收了数据的容器对象,返回给pipelies.py

# -*- coding: utf-8 -*-
import scrapy
from adc.items import AdcItem  #导入items.py里的AdcItem类,容器类

class PachSpider(scrapy.Spider):                 #定义爬虫类,必须继承scrapy.Spider
    name = 'pach'                                #设置爬虫名称
    allowed_domains = ['search.dangdang.com']    #爬取域名
    start_urls = ['http://category.dangdang.com/pg1-cid4008149.html']     #爬取网址

    def parse(self, response):                   #parse回调函数
        item = AdcItem()                         #实例化容器对象
        item['title'] = response.xpath('//p[@class="name"]/a/text()').extract()  #表达式过滤获取到数据赋值给,容器类里的title变量
        # print(rqi['title'])
        item['link'] = response.xpath('//p[@class="name"]/a/@href').extract()    #表达式过滤获取到数据赋值给,容器类里的link变量
        # print(rqi['link'])
        item['comment'] = response.xpath('//p[@class="star"]//a/text()').extract() #表达式过滤获取到数据赋值给,容器类里的comment变量
        # print(rqi['comment'])
        yield item   #接收了数据的容器对象,返回给pipelies.py

robots协议

注意:如果获取的网站在robots.txt文件里设置了,禁止爬虫爬取协议,那么将无法爬取,因为scrapy默认是遵守这个robots这个国际协议的,如果想不遵守这个协议,需要在settings.py设置

到settings.py文件里找到ROBOTSTXT_OBEY变量,这个变量等于False不遵守robots协议,等于True遵守robots协议

# Obey robots.txt rules
ROBOTSTXT_OBEY = False   #不遵循robots协议

第三步、编写pipelines.py数据处理文件

如果需要pipelines.py里的数据处理类能工作,需在settings.py设置文件里的ITEM_PIPELINES变量里注册数据处理类

# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
   'adc.pipelines.AdcPipeline': 300,  #注册adc.pipelines.AdcPipeline类,后面一个数字参数表示执行等级,数值越大越先执行
}

注册后pipelines.py里的数据处理类就能工作

定义数据处理类,必须继承object

process_item(item)为数据处理函数,接收一个item,item里就是爬虫最后yield item 来的数据对象

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

class AdcPipeline(object):                      #定义数据处理类,必须继承object
    def process_item(self, item, spider):       #process_item(item)为数据处理函数,接收一个item,item里就是爬虫最后yield item 来的数据对象
        for i in range(0,len(item['title'])):   #可以通过item['容器名称']来获取对应的数据列表
            title = item['title'][i]
            print(title)
            link = item['link'][i]
            print(link)
            comment = item['comment'][i]
            print(comment)
        return item

最后执行

执行爬虫文件,scrapy crawl pach --nolog

image

可以看到我们需要的数据已经拿到了

【转载自:http://www.lqkweb.com

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏JAVAandPython君

Scrapy框架| 选择器-Xpath和CSS的那些事

这次接着上一篇文章来讲Scrapy框架,这次讲的是Scrapy框架里面提供的两种数据提取机制Xpath和CSS,其实除了这两种,我们还可以借助第三...

24630
来自专栏python爬虫实战之路

用python实现自己的小说阅读器

前一段时间书荒的时候,在喜马拉雅APP发现一个主播播讲的小说-大王饶命。听起来感觉很好笑,挺有意思的,但是只有前200张是免费的,后面就要收费。一章两毛钱,本来...

28720
来自专栏数据挖掘

selenium之xpath定位和input文本

10240
来自专栏宜信技术实践

WEB-UI自动化实践

随着IT行业的发展,产品愈渐复杂,web端业务及流程更加繁琐,目前UI测试仅是针对单一页面,操作量大。为了满足多页面功能及流程的需求及节省工时,设计了这款UI ...

1.1K20
来自专栏Jerry的SAP技术分享

for-each keyword

使用for-each可以避免使用两次apply-templates. 用于测试的xml:

10260
来自专栏分布式爬虫

4、web爬虫,scrapy模块标签选择器下载图片,以及正则匹配标签

HtmlXPathSelector()创建标签选择器对象,参数接收response回调的html对象

10420
来自专栏编程之路的专栏

Python 爬虫之Selenium终极绝招

这里简单解释一下什么是Selenium,它其实是一个网站前端压力测试框架,更通俗的说,它能直接操作浏览器,试想一下,网页是在浏览器里面加载的,如果我们能用代码操...

10930
来自专栏Python绿色通道

项目实战 | 手把手做一款小说阅读器

前一段时间书荒的时候,在喜马拉雅APP发现一个主播播讲的小说-大王饶命。听起来感觉很好笑,挺有意思的,但是只有前200张是免费的,后面就要收费。一章两毛钱,本来...

22420
来自专栏数据挖掘

Amazon关键词抓取 python之lxml(xpath)

8420
来自专栏dylanliu

124. Binary Tree Maximum Path Sum

Given a non-empty binary tree, find the maximum path sum.

8240

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励