Spider由自己定义爬虫逻辑,主要是编写Request以及处理Response
Scheduler调度器,用于处理Spider提交的Request队列(优先级、去重等),可自己定制
下载器接收Scheduler任务后,向互联网发送Request,下载网络资源,接收Response
Spider在接收Response后进行处理,输出结果Item,由ItemPipeline进行最终处理及存储
中间件主要分两个,一个是DownloaderMiddleware,一个是SpiderMiddleware
可理解成Request与Response在整个Scrapy流程中的修改器
(1).文件夹Spiders中包含自己定义的各个Spider,运行的时候可根据Spider名选择用哪个
(2).items.py 中定义了最终要输出的结果,相当于先给各个结果字段建个空列
(3).middlewares.py 中定义DownloaderMiddleware以及SpiderMiddleware
(4).pipelines.py 中定义结果流向、Item的处理方法、下载文件的处理方法等
(5).settings.py 中定义组件的优先级、数据库、延时、User-Agent等参数
> scrapy startproject Bidding
> scrapy genspider bidding ggzy.gov.cn
bidding为Spider名称,启动scrapy时需用到
> scrapy crawl bidding
ggzy.gov.cn为该Spider爬取的网站域名
Spider抛出的第一个Request,可由scrapy.FormRequest编辑提交内容
yield scrapy.FormRequest(url='', formdata='', meta={'', ''}, callback=self.parse)
url为请求地址,该项目url = 'http://deal.ggzy.gov.cn/ds/deal/dealList_find.jsp'
formdata为提交的表格内容,类型是字典
meta为带入callback函数中的参数,类型是字典,即可在parse函数中使用该字典的变量
callback为处理该request返回的response的函数,即经过Downloader返回response到Spider中进行进一步处理
该函数用于处理返回的response,也可再次抛出request
可设置多个parse函数,通过调整yield request中的callback参数来选择由哪一个parse函数处理response
该项目中,共有4个parse函数:
该函数用于翻页、切换搜索关键词以及进入下一层页面解析
因为工程建设文档与政府采购文档差异较大,所以要分两类进入再下一层页面解析
政府采购文档的解析函数
工程建设文档的解析函数
先引用item的定义文件:
from Bidding import items
在解析函数中创建item:
item = items.BiddingItem()
在解析函数中设置item参数:
item['pro_id'] = pro_id
抛出item到ItemPipelines中:
yield item
创建Item类并定义各字段
Class BiddingItem(scrapy.Item):
pro_id = scarpy.Field()
......
import pymongo
from Bidding import settings
class BiddingPipeline:
client = pymongo.MongoClient(host=settings.MONGODB_HOST, port=settings.MONGODB_PORT)
db = client[settings.MONGODB_DBNAME]
self.sheet = db[settings.MONGODB_SHEETNAME]
在函数process_item中定义spider抛出item的处理方法
该项目在此处进行去重
from scrapy.pipelines.files import FilesPipeline
class FileDownloadPipeline(FilesPipeline):
def get_media_requests(self, item, info):
urls = ItemAdapter(item).get(self.files_urls_field, [])
names = ItemAdapter(item).get(self.files_names_field, [])
for i in range(0, len(urls)):
return [Request(url=urls[i], meta={'name': names[i]})]
def file_path(self, request, response=None, info=None, *, item=None):
return '%s' % request.meta['name']
SpiderMiddleware, DownloaderMiddleware, Pipelines等
数据库参数,延时,是否遵从爬虫协议,下载文件路径,User-Agent,日志等级和路径等