scrapy 框架

class RandomProxiesDownloadmidderware(object):

    def __init__(self, proxies):

        self.proxies= proxies

@classmethod

    def from_crawler(cls, crawler):

        proxies= crawler.sittings['PROXIES']

        return cls(proxies)

    def process_request(self, spider, request):

        dict_proxy = random.choice(self.proxies)

REQUEST

url: 就是需要请求,并进行下一步处理的url

callback: 指定该请求返回的Response,由那个函数来处理。

method: 请求一般不需要指定,默认GET方法,可设置为"GET", "POST", "PUT"等,且保证字符串大写

headers: 请求时,包含的头文件。一般不需要。内容一般如下:# 自己写过爬虫的肯定知道Host:media.readthedocs.orgUser-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0Accept: text/css,/;q=0.1Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateReferer:http://scrapy-chs.readthedocs.org/zh_CN/0.24/Cookie: _ga=GA1.2.1612165614.1415584110;Connection: keep-aliveIf-Modified-Since: Mon, 25 Aug 2014 21:59:35 GMTCache-Control: max-age=0

meta: 比较常用,在不同的请求之间传递数据使用的。字典dict型

  request_with_cookies = Request(

      url="http://www.example.com",

      cookies={'currency': 'USD', 'country': 'UY'},

      meta={'dont_merge_cookies': True}

  )

encoding: 使用默认的 'utf-8' 就行。

dont_filter: 表明该请求不由调度器过滤。这是当你想使用多次执行相同的请求,忽略重复的过滤器。默认为False。

errback: 指定错误处理函数

RESPONSE

status: 响应码

_set_body(body): 响应体

_set_url(url):响应url

self.request= request (request对象)

self.headers= Headers (响应头)

scrapy框架

Scrapy Engine(引擎): 负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯,信号、数据传递等。

Scheduler(调度器): 它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列,入队,当引擎需要时,交还给引擎。

Downloader(下载器):负责下载Scrapy Engine(引擎)发送的所有Requests请求,并将其获取到的Responses交还给Scrapy Engine(引擎),由引擎交给Spider来处理,

Spider(爬虫):它负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据,并将需要跟进的URL提交给引擎,再次进入Scheduler(调度器),

Item Pipeline(管道):它负责处理Spider中获取到的Item,并进行进行后期处理(详细分析、过滤、存储等)的地方.

Downloader Middlewares(下载中间件):你可以当作是一个可以自定义扩展下载功能的组件。

Spider Middlewares(Spider中间件):你可以理解为是一个可以自定扩展和操作引擎和Spider中间通信的功能组件(比如进入Spider的Responses;和从Spider出去的Requests)

安装方式  sudo pip3 install scrapy

新建项目

          scrapy startproject 爬虫项目名称

         进入项目,再次进入项目文件夹,在进入spdeers执行以下命令

                   scrapy genspider 爬虫文件名称 域名

      使用pycharm打开,配置 虚拟环境,配置需要的settings,在爬虫文件中爬取所需要的数据,以及起始的url,在items中定义字段

     yield 的作用就是把一个函数变成一个 generator(生成器),带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个      generator,带有yeild的函数遇到yeild的时候就返回一个迭代值,下次迭代时,代码从 yield 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

scrapy crawl 项目名称启动项目

数据持久化,也就是将爬取到的数据存放到数据库中,一般有mysql mongod redis, 想要存放数据,首先要激活管道文件,在settings中items打开

# 将数据存储在mongodb中

    def __init__(self,host,port,dbname,sheetname):

        # 创建MONGODB数据库链接

        client = pymongo.MongoClient(host=host, port=port)

        # 指定数据库

        mydb = client[dbname]

        # 存放数据的数据库表名

        self.mysheet = mydb[sheetname]

    @classmethod

    def from_crawler(cls, crawler):

        host = crawler.settings["MONGODB_HOST"]

        port = crawler.settings["MONGODB_PORT"]

        dbname = crawler.settings["MONGODB_DBNAME"]

        sheetname = crawler.settings["MONGODB_SHEETNAME"]


        return cls(host,port,dbname,sheetname)

    def process_item(self,item,spider):

        data = dict(item)

        # mongodb数据插入语句,使用save保存数据的效率会很慢,因为它需要循环便利,操作费时

        self.mysheet.insert(data)

        return item

通用爬虫

scrapy genspider -t crawl 爬虫文件 域名

rules

CrawlSpider使用rules属性来决定爬虫的爬取规则,并将匹配后的url请求提交给引擎,完成后续的爬取工作。

link_extractor:是一个Link Extractor对象,用于定义需要提取的链接。

callback: 从link_extractor中每获取到链接得到Responses时,会调用参数所指定的值作为回调函数,该回调函数接收一个response作为其一个参数。

follow:是一个布尔(boolean)值,指定了根据该规则从response提取的链接是否需要跟进。如果callback为None,follow 默认设置为True ,否则默认为False。

process_links:指定spider中哪个的函数将会被调用,从link_extractor中获取到链接列表时将会调用该函数。该方法主要用来过滤。

process_request:指定处理函数,根据该Rule提取到的每个Request时,该函数将会被调用,可以对Request进行处理,该函数必须返回Request或者None

主要参数:

allow:满足括号中“正则表达式”的URL会被提取,如果为空,则全部匹配。

deny:满足括号中“正则表达式”的URL一定不提取(优先级高于allow)。

allow_domains:会提取的链接的domains。

deny_domains:一定不会被提取链接的domains。

restrict_xpaths:使用xpath表达式,和allow共同作用过滤链接。

第一步:根据要爬取的网页确定需要保存的字段

第二步:编写爬虫类

LinkExtractor实例对象

LinkExtractor方法中的常用的参数

allow : LinkExtractor对象最重要的参数之一,这是一个正则表达式,必须要匹配这个正则表达式(或正则表达式列表)的URL才会被提取,如果没有给出(或为空), 它会匹配所有的链接。

deny : 用法同allow,只不过与这个正则表达式匹配的URL不会被提取)。它的优先级高于 - allow 的参数,如果没有给出(或None), 将不排除任何链接。

allow_domains:包含了spider允许爬取的域名(domain)列表(list)

deny_domains=():包含了spider不允许爬取的域名(domain)列表(list)

通用爬虫的起始url不会获得响应,如果需要,需要重现def parse_start_url(self, response):方法

你可能感兴趣的:(scrapy 框架)