栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

神器 Spider!几分钟入门分布式爬虫!

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

神器 Spider!几分钟入门分布式爬虫!

self.emRatingName   None  # 评级名称         self.emRatingValue   None  # 评级代码         self.encodeUrl   None  # 链接         # self.id   None         self.indvInduCode   None  # 行业代码         self.indvInduName   None  # 行业名称         self.lastEmRatingName   None  # 上次评级名称         self.lastEmRatingValue   None  # 上次评级代码         self.orgCode   None  # 机构代码         self.orgName   None  # 机构名称         self.orgSName   None  # 机构简称         self.predictNextTwoYearEps   None         self.predictNextTwoYearPe   None         self.predictNextYearEps   None         self.predictNextYearPe   None         self.predictThisYearEps   None         self.predictThisYearPe   None         self.publishDate   None  # 发表时间         self.ratingChange   None  # 评级变动         self.researcher   None  # 研究员         self.stockCode   None  # 股票代码         self.stockName   None  # 股票简称         self.title   None  # 报告名称

若字段有默认值或者自增 则默认注释掉 可按需打开。大家可以看到我这张表的 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
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/268237.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号