目录
一、项目启动
二、Item 指定对象内容 – 类比 ORM
三、Spider 爬取数据
四、执行爬虫
五、pipeline 数据数据库存储
5-1 存储
5-2 配置参数
5-3 激活管道
scrapy – 官方1.6版本文档
一、项目启动
scrapy 入门教程
确认环境
创建 scrapy 项目目录
进入自定义目录创建项目目录 scrapy startproject yourprojectname
二、Item 指定对象内容 – 类比 ORM
类似在ORM中做的一样,您可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个 Item。
用于将数据封装成类,在其他地方进行基于类的快速调用。
import scrapy class GetBabtItem(scrapy.Item): title = scrapy.Field() content = scrapy.Field() time = scrapy.Field() wherefrom = scrapy.Field()
三、Spider 爬取数据
Spiders/爬虫脚本.py – 制作爬虫爬取网页
注意点总结
- scrapy.Spider 类内 name 属性必须重写,且值唯一
- scrapy.Spider 类内 parse() 方法必须重写,作为爬取数据的处理函数
import scrapy class BabtSpider(scrapy.Spider): # 必须为每一个Spider脚本重写name属性,且必须唯一 name = 'Babt' # 爬虫爬取数据 url 列表 start_urls = [ 'https://www.8btc.com/flash' ] # 必须重写!! 不然设置报错 def parse(self, response): ''' 对爬取数据的业务逻辑处理 :param response: urls列表的爬取数据 :return: ''' print(response)
四、执行爬虫
import scrapy from bs4 import BeautifulSoup from myscrapy.items import GetBabtItem class BabtSpider(scrapy.Spider): # 必须为每一个Spider脚本重写name属性,且必须唯一 name = 'Babt' # 爬虫爬取数据 url 列表 start_urls = [ 'https://www.8btc.com/flash' ] # 必须重写!! 不然设置报错 def parse(self, response): ''' 对爬取数据的业务逻辑处理 Request对象经过调度,执行生成 scrapy.http.Response 对象并送回给 spider parse() 方法。 :param response: urls列表的爬取数据 :return: ''' # print('===============爬取对象============', response) # print('==============爬取网址内容==============', response.body) # print('==============获取爬取网址================', response.url) # print('=============基于xpath的数据获取===============', response.xpath('//ul/li/text()').extract()) body = str(response.body, encoding='utf-8') babt = BeautifulSoup(body, 'lxml') flash_li = babt.find_all('li', class_='flash-item') for flash in flash_li: flash_content = flash.find('div', class_='flash-item__content') title = flash_content.find_previous_sibling('a').span.text.strip(' ') content = flash_content.text time = flash_content.find_previous_sibling('span').text wherefrom = flash.find('span', class_='operate-item operate-item__source').a.text.strip(' ') item = GetBabtItem() item['time'] = time item['wherefrom'] = wherefrom item['title'] = title item['content'] = content yield item
五、pipeline 数据数据库存储
官方文档 – pipeline
5-1 存储
# pipelines.py import pymongo import time class MongoPipeline(object): collection_name = 'scrapy_items' def __init__(self, mongo_uri, mongo_db): self.mongo_uri = mongo_uri self.mongo_db = mongo_db # 创建管道实例 crawler,必须返回管道的新实例 @classmethod def from_crawler(cls, crawler): ''' :param crawler: Crawlerobject – 使用此管道的爬网程序 :return: ''' return cls( mongo_uri=crawler.settings.get('MONGO_URI'), mongo_db=crawler.settings.get('MONGO_DATABASE', 'items') ) # 当打开spider时,被调用 # 执行爬虫时建立数据库连接 def open_spider(self, spider): self.client = pymongo.MongoClient(self.mongo_uri) self.db = self.client[self.mongo_db] # 关闭spider时,被调用 # 关闭爬虫时关闭连接 def close_spider(self, spider): self.client.close() # 必重写 def process_item(self, item, spider): ''' 业务逻辑处理 – 去重 – 存储 :param item: item对象 :param spider: spider对象 :return: ''' today = time.strftime('%Y/%m/%d') self.db[today].insert_one(dict(item)) return item
5-2 配置参数
MONGO_URI = 'mongodb://localhost:27017/' MONGO_DATABASE = 'crawlers'
5-3 激活管道
神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试