码迷,mamicode.com
首页 > 其他好文 > 详细

Scrapy 框架,爬虫文件相关

时间:2019-02-09 10:32:58      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:回调   response   dom   pid   组成   images   doc   返回值   正则表达   

Spiders

介绍

由一系列定义了一个网址或一组网址类如何被爬取的类组成

具体包括如何执行爬取任务并且如何从页面中提取结构化的数据。

简单来说就是帮助你爬取数据的地方

内部行为

#1、生成初始的Requests来爬取第一个URLS,并且标识一个回调函数
第一个请求定义在start_requests()方法内默认从start_urls列表中获得url地址来生成Request请求
默认的回调函数是parse方法。回调函数在下载完成返回response时自动触发 #2、在回调函数中,解析response并且返回值 返回值可以4种: 包含解析数据的字典 Item对象 新的Request对象(新的Requests也需要指定一个回调函数) 或者是可迭代对象(包含Items或Request) #3、在回调函数中解析页面内容 通常使用Scrapy自带的Selectors,
也可以使用Beutifulsoup,lxml或其他 #4、最后,针对返回的Items对象将会被持久化到数据库 通过Item Pipeline组件存到数据库:https://docs.scrapy.org/en/latest/topics/item-pipeline.html#topics-item-pipeline) 或者导出到不同的文件(通过Feed exports:https://docs.scrapy.org/en/latest/topics/feed-exports.html#topics-feed-exports)

 内部类

#1、scrapy.spiders.Spider 
  #scrapy.Spider等同于scrapy.spiders.Spider #2、scrapy.spiders.CrawlSpider #3、scrapy.spiders.XMLFeedSpider #4、scrapy.spiders.CSVFeedSpider #5、scrapy.spiders.SitemapSpider

class scrapy.spiders.Spider

这是最简单的spider类,任何其他的spider类都需要继承它(包含你自己定义的)。

该类不提供任何特殊的功能,它仅提供了一个默认的start_requests方法默认从start_urls中读取url地址发送requests请求,并且默认parse作为回调函数

 基础使用框架

import scrapy
class AmazonSpider(scrapy.Spider):

    name = amazon  # 必须唯一
    allowed_domains = [www.amazon.cn]  # 允许域
    start_urls = [http://www.amazon.cn/]  # 如果你没有指定发送的请求地址,会默认使用第一个

    def parse(self,response):
          pass

 

 详细使用框架

import scrapy
class AmazonSpider(scrapy.Spider):
    def __init__(self,keyword=None,*args,**kwargs):  #在entrypoint文件里面传进来的keyword,在这里接收了
        super(AmazonSpider,self).__init__(*args,**kwargs)
        self.keyword = keyword

    name = amazon  # 必须唯一
    allowed_domains = [www.amazon.cn]  # 允许域
    start_urls = [http://www.amazon.cn/]  # 如果你没有指定发送的请求地址,会默认使用第一个

    custom_settings = {  # 自定制配置文件,自己设置了用自己的,没有就找父类的
        "BOT_NAME": HAIYAN_AMAZON,
        REQUSET_HEADERS: {},
    }

    def start_requests(self):
        url = https://www.amazon.cn/s/ref=nb_sb_noss_1/461-4093573-7508641?
        url+=urlencode({"field-keywords":self.keyword})
        print(url)
        yield  scrapy.Request(
            url,
            callback = self.parse_index,  #指定回调函数
            dont_filter = True,  #不去重,这个也可以自己定制
            # dont_filter = False,  #去重,这个也可以自己定制
            # meta={‘a‘:1}  #meta代理的时候会用
        )
        #如果要想测试自定义的dont_filter,可多返回结果重复的即可

 

 属性,方法详解

技术图片属性,方法

 特殊操作

去重

去重规则应该多个爬虫共享的,但凡一个爬虫爬取了,其他都不要爬了,实现方式如下

技术图片自定义去重

 传递参数

# 我们可能需要在命令行为爬虫程序传递参数,比如传递初始的url,像这样

#命令行执行
scrapy crawl myspider -a category=electronics

#在__init__方法中可以接收外部传进来的参数
import scrapy

class MySpider(scrapy.Spider):
    name = myspider

    def __init__(self, category=None, *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.start_urls = [http://www.example.com/categories/%s % category]
        #...

        
#注意接收的参数全都是字符串,如果想要结构化的数据,你需要用类似json.loads的方法

 

例子合集

技术图片sprider例子

 Selectors

scray 自带的用于在回调函数中解析页面内容的组件

相关方法

#1 // 与 /
#2 text
#3 extract与extract_first:从selector对象中解出内容
#4 属性:xpath的属性加前缀@
#4 嵌套查找
#5 设置默认值
#4 按照属性查找
#5 按照属性模糊查找
#6 正则表达式
#7 xpath相对路径
#8 带变量的xpath

 详细操作展示

response.selector.css()
response.selector.xpath()
可简写为
response.css()
response.xpath()

#1 //与/
response.xpath(//body/a/)#
response.css(div a::text)

>>> response.xpath(//body/a) #开头的//代表从整篇文档中寻找,body之后的/代表body的儿子
[]
>>> response.xpath(//body//a) #开头的//代表从整篇文档中寻找,body之后的//代表body的子子孙孙
[<Selector xpath=//body//a data=<a href="image1.html">Name: My image 1 <>, <Selector xpath=//body//a data=<a href="image2.html">Name: My image 2 <>, <Selector xpath=//body//a data=<a href="
image3.html">Name: My image 3 <‘>, <Selector xpath=‘//body//a‘ data=‘<a href="image4.html">Name: My image 4 <‘>, <Selector xpath=‘//body//a‘ data=‘<a href="image5.html">Name: My image 5 <‘>]

#2 text
>>> response.xpath(//body//a/text())
>>> response.css(body a::text)

#3、extract与extract_first:从selector对象中解出内容
>>> response.xpath(//div/a/text()).extract()
[Name: My image 1 , Name: My image 2 , Name: My image 3 , Name: My image 4 , Name: My image 5 ]
>>> response.css(div a::text).extract()
[Name: My image 1 , Name: My image 2 , Name: My image 3 , Name: My image 4 , Name: My image 5 ]

>>> response.xpath(//div/a/text()).extract_first()
Name: My image 1 
>>> response.css(div a::text).extract_first()
Name: My image 1 

#4、属性:xpath的属性加前缀@
>>> response.xpath(//div/a/@href).extract_first()
image1.html
>>> response.css(div a::attr(href)).extract_first()
image1.html

#4、嵌套查找
>>> response.xpath(//div).css(a).xpath(@href).extract_first()
image1.html

#5、设置默认值
>>> response.xpath(//div[@id="xxx"]).extract_first(default="not found")
not found

#4、按照属性查找
response.xpath(//div[@id="images"]/a[@href="image3.html"]/text()).extract()
response.css(#images a[@href="image3.html"]/text()).extract()

#5、按照属性模糊查找
response.xpath(//a[contains(@href,"image")]/@href).extract()
response.css(a[href*="image"]::attr(href)).extract()

response.xpath(//a[contains(@href,"image")]/img/@src).extract()
response.css(a[href*="imag"] img::attr(src)).extract()

response.xpath(//*[@href="image1.html"])
response.css(*[href="image1.html"])

#6、正则表达式
response.xpath(//a/text()).re(rName: (.*))
response.xpath(//a/text()).re_first(rName: (.*))

#7、xpath相对路径
>>> res=response.xpath(//a[contains(@href,"3")])[0]
>>> res.xpath(img)
[<Selector xpath=img data=<img src="image3_thumb.jpg">>]
>>> res.xpath(./img)
[<Selector xpath=./img data=<img src="image3_thumb.jpg">>]
>>> res.xpath(.//img)
[<Selector xpath=.//img data=<img src="image3_thumb.jpg">>]
>>> res.xpath(//img) #这就是从头开始扫描
[<Selector xpath=//img data=<img src="image1_thumb.jpg">>, <Selector xpath=//img data=<img src="image2_thumb.jpg">>, <Selector xpath=//img data=<img src="image3_thumb.jpg">>, <Selector xpa
th=//img data=<img src="image4_thumb.jpg">>, <Selector xpath=//img data=<img src="image5_thumb.jpg">>]

#8、带变量的xpath
>>> response.xpath(//div[@id=$xxx]/a/text(),xxx=images).extract_first()
Name: My image 1 
>>> response.xpath(//div[count(a)=$yyy]/@id,yyy=5).extract_first() #求有5个a标签的div的id
images

 

 

Scrapy 框架,爬虫文件相关

标签:回调   response   dom   pid   组成   images   doc   返回值   正则表达   

原文地址:https://www.cnblogs.com/shijieli/p/10357112.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!