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
源码分析
内部源码封装实现的方法
来源: http://www.bubuko.com/infodetail-3309096.html