若字段有默认值或者自增 则默认注释掉 可按需打开。大家可以看到我这张表的 id 字段在这里被注释了。
若item字段过多 不想逐一赋值 可通过如下方式创建
feapder create -i report 1
这时候生成的实体类是这样的
class ReportItem(Item): This class was generated by feapder. command: feapder create -i report 1. __table_name__ report 1 def __init__(self, *args, **kwargs): self.count kwargs.get( count ) self.emRatingName kwargs.get( emRatingName ) # 评级名称 self.emRatingValue kwargs.get( emRatingValue ) # 评级代码 self.encodeUrl kwargs.get( encodeUrl ) # 链接 # self.id kwargs.get( id ) self.indvInduCode kwargs.get( indvInduCode ) # 行业代码 self.indvInduName kwargs.get( indvInduName ) # 行业名称 self.lastEmRatingName kwargs.get( lastEmRatingName ) # 上次评级名称 self.lastEmRatingValue kwargs.get( lastEmRatingValue ) # 上次评级代码 self.orgCode kwargs.get( orgCode ) # 机构代码 self.orgName kwargs.get( orgName ) # 机构名称 self.orgSName kwargs.get( orgSName ) # 机构简称 self.predictNextTwoYearEps kwargs.get( predictNextTwoYearEps ) self.predictNextTwoYearPe kwargs.get( predictNextTwoYearPe ) self.predictNextYearEps kwargs.get( predictNextYearEps ) self.predictNextYearPe kwargs.get( predictNextYearPe ) self.predictThisYearEps kwargs.get( predictThisYearEps ) self.predictThisYearPe kwargs.get( predictThisYearPe ) self.publishDate kwargs.get( publishDate ) # 发表时间 self.ratingChange kwargs.get( ratingChange ) # 评级变动 self.researcher kwargs.get( researcher ) # 研究员 self.stockCode kwargs.get( stockCode ) # 股票代码 self.stockName kwargs.get( stockName ) # 股票简称 self.title kwargs.get( title ) # 报告名称
这样当我们请求回来的json数据时 可直接赋值 如:
response_data { title : 测试 } # 模拟请求回来的数据
item SpiderDataItem(**response_data)
想要数据自动入库也比较简单 在解析完数据之后 将数据赋值给 Item 然后 yield 就行了
def parse(self, request, response): html response.content.decode( utf-8 ) if len(html): content html.replace( datatable1351846( , )[:-1] content_json json.loads(content) print(content_json) for obj in content_json[ data ]: result ReportItem() result[ orgName ] obj[ orgName ] #机构名称 result[ orgSName ] obj[ orgSName ] #机构简称 result[ publishDate ] obj[ publishDate ] #发布日期 result[ predictNextTwoYearEps ] obj[ predictNextTwoYearEps ] #后年每股盈利 result[ title ] obj[ title ] #报告名称 result[ stockName ] obj[ stockName ] #股票名称 result[ stockCode ] obj[ stockCode ] #股票code result[ orgCode ] obj[ stockCode ] #机构code result[ predictNextTwoYearPe ] obj[ predictNextTwoYearPe ] #后年市盈率 result[ predictNextYearEps ] obj[ predictNextYearEps ] # 明年每股盈利 result[ predictNextYearPe ] obj[ predictNextYearPe ] # 明年市盈率 result[ predictThisYearEps ] obj[ predictThisYearEps ] #今年每股盈利 result[ predictThisYearPe ] obj[ predictThisYearPe ] #今年市盈率 result[ indvInduCode ] obj[ indvInduCode ] # 行业代码 result[ indvInduName ] obj[ indvInduName ] # 行业名称 result[ lastEmRatingName ] obj[ lastEmRatingName ] # 上次评级名称 result[ lastEmRatingValue ] obj[ lastEmRatingValue ] # 上次评级代码 result[ emRatingValue ] obj[ emRatingValue ] # 评级代码 result[ emRatingName ] obj[ emRatingName ] # 评级名称 result[ ratingChange ] obj[ ratingChange ] # 评级变动 result[ researcher ] obj[ researcher ] # 研究员 result[ encodeUrl ] obj[ encodeUrl ] # 链接 result[ count ] int(obj[ count ]) # 近一月个股研报数 yield result
返回item后 item 会流进到框架的 ItemBuffer, ItemBuffer 每.05秒或当item数量积攒到5000个 便会批量将这些 item 批量入库。表名为类名去掉 Item 的小写 如 ReportItem 数据会落入到 report 表。
开发过程中 我们可能需要针对某个请求进行调试 常规的做法是修改下发任务的代码。但这样并不好 改来改去可能把之前写好的逻辑搞乱了 或者忘记改回来直接发布了 又或者调试的数据入库了 污染了库里已有的数据 造成了很多本来不应该发生的问题。
本框架支持Debug爬虫 可针对某条任务进行调试 写法如下
if __name__ __main__ : spider SpiderTest.to_DebugSpider( redis_key feapder:spider_test , request feapder.Request( http://www.baidu.com ) ) spider.start()
对比之前的启动方式
spider SpiderTest(redis_key feapder:spider_test ) spider.start()
可以看到 代码中 to_DebugSpider 方法可以将原爬虫直接转为 debug 爬虫 然后通过传递 request 参数抓取指定的任务。
通常结合断点来进行调试 debug 模式下 运行产生的数据默认不入库。
除了指定 request 参数外 还可以指定 request_dict 参数 request_dict 接收字典类型 如 request_dict { url : http://www.baidu.com }, 其作用于传递 request 一致。request 与 request_dict 二者选一传递即可。
运行多个爬虫通常 一个项目下可能存在多个爬虫 为了规范 建议启动入口统一放到项目下的 main.py 中 然后以命令行的方式运行指定的文件。
例如如下项目
项目中包含了两个spider main.py写法如下
from spiders import * from feapder import Request from feapder import ArgumentParser



