scrapy补充-异步爬虫

spiders

介绍:在项目中是创建爬虫程序的py文件

#1、Spiders是由一系列类(定义了一个网址或一组网址将被爬取)组成,具体包括如何执行爬取任务并且如何从页面中提取结构化的数据。

#2、换句话说,Spiders是你为了一个特定的网址或一组网址自定义爬取和解析页面行为的地方

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)

Spiders总共提供了五种类:

#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

导入使用

# -*- coding: utf-8 -*-
import scrapy
from scrapy.spiders import Spider,CrawlSpider,XMLFeedSpider,CSVFeedSpider,SitemapSpider

class AmazonSpider(scrapy.Spider): #自定义类,继承Spiders提供的基类
    name = 'amazon'
    allowed_domains = ['www.amazon.cn']
    start_urls = ['http://www.amazon.cn/']
    

```
def parse(self, response):
    pass
```

数据存储到mongodb

pipelins的使用流程:

  settings.py配置,item里定义要获取的数据的models,pipelins.py里连接数据库,cnblogs.py书写爬取数据的内容。

1、 在item中写一个类,有一个一个字段,类似django的models

import scrapy

# class MyscrapyItem(scrapy.Item):
#     # define the fields for your item here like:
#     # name = scrapy.Field()
#     pass
class ArticleItem(scrapy.Item):
    article_name = scrapy.Field()
    article_url = scrapy.Field()
    auther_name = scrapy.Field()
    commit_count = scrapy.Field()

2、settings.py,在setting中配置pipeline,优先级。

3、 pipelines.py

连接数据库,书写一堆方法

# -ArticleMongodbPipeline
                 -init
                 -from_crawler
                -open_spider
                 -close_spider
                -process_item
                    -相应的写存储
                    return的东西是有区别的,如果item,下一个pipelins能够继续拿到,如果return None,下一个拿不到
#             -ArticleFilePipeline

代码实现:

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

from pymongo import MongoClient
class ArticleMongodbPipeline(object):
    def process_item(self, item, spider):

        # client = MongoClient('mongodb://localhost:27017/')
        #连接
        client = MongoClient('localhost', 27017)
        #创建article数据库,如果没有叫创建,如果有,叫使用
        db = client['article']
        # print(db)
        #如果有使用articleinfo,如果没有,创建这个表
        article_info=db['articleinfo']

        article_info.insert(dict(item))
        # article_info.save({'article_name':item['article_name'],'aritcle_url':item['article_url']})
        # 如果retrun None ,下一个就取不到item了,取到的就是None


class ArticleFilePipeline(object):
    # def __init__(self,host,port):
    def __init__(self):
        # self.mongo_conn=MongoClient(host,port)
        pass

    #如果这个类中有from_crawler,首先会执行from_crawler,aa=ArticleFilePipeline.from_crawler(crawler)
    #如果没有直接aa=ArticleFilePipeline()
    @classmethod
    def from_crawler(cls, crawler):
        print('')
        #mongodb的配置信息在setting中
        # host = '从配置文件中拿出来的'
        # port='从配置文件中拿出来的'
        #crawler.settings总的配置文件
        print('asdfasdfasfdasfd',crawler.settings['AA'])
        # return cls(host,port)
        return cls()

    def open_spider(self, spider):
        # print('----',spider.custom_settings['AA'])
        self.f = open('article.txt','a')


    def close_spider(self, spider):
        self.f.close()
        print('close spider')


    def process_item(self, item, spider):
        pass

去重 

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

自定义去重方案

下载中间件的使用

爬虫中间件

信号和配置信息

布隆过滤器

分布式爬虫-scrapy-redis

源码分析

内部源码封装实现的方法

猜你喜欢

转载自www.cnblogs.com/Gaimo/p/11960610.html