セレクション(2)アーキテクチャの実装フレームワークと爬虫類プラットフォーム

再生: https://www.cnblogs.com/laoqing
上記で説明基本動作scrapyを、以下に記載し、以下に内部アーキテクチャの実装scrapyクローラを


1蜘蛛(爬虫類):それは、すべてのハンドル応答、取得するために分析からデータを抽出するデータ項目に必要なフィールドを、フォローアップが必要になります再入力し、エンジンのURLに提出スケジューラ(スケジューラ
2エンジン(エンジン)の責任スパイダー、ItemPipeline、ダウンローダ、ように中央スケジューラ通信、信号、データ転送および。
3スケジューラ(スケジューラ):それはから送信されたエンジン受け入れる責任あるリクエスト要求を、そしてエンジンは時間を必要とするとき彼らは、チームの中に、特定の方法で配置され、整理、エンジンに戻りました。
。4ダウンローダー(ダウンローダー):ダウンロードするための責任Scrapyエンジン(エンジン全て)は、送信要求の要求を、取得した応答が返さScrapyエンジン(エンジンにエンジンによって、)治療スパイダー
5ItemPipeline(パイプ):これは、ハンドルスパイダーで取得アイテム、および後処理(詳細な分析、濾過、ストレージなど)場所
6Downloaderのミドルウェア(ダウンロードミドルウェア):カスタムコンポーネントがダウンロード機能を拡張することが可能とあなたは考えることができます。
。7スパイダーミドルウェア(スパイダーミドルウェア):あなたが拡張として理解することができ、エンジンの運転およびカスタマイズすることができ、中間通信スパイダーの機能構成要素を(例えば入るようスパイダー応答とからスパイダーアウト要求)。

Scrapyのプロセスは次のようにプロセス全体を通じて爬虫類:

作成されたプロジェクトのscrapyが生成されます爬虫類middlewares.py文書は、このファイルには二つの処理ミドルウェアを定義しSpiderMiddlewareとミドルウェアの前と後の両方、DownloaderMiddlewareは、要求と要求のフィルタリングを担当している応答フィルタを。
基づいて、前述した爬虫類の非同期scrapy、ここ爬虫類は爬虫類を返され、いくつかのリアルタイム、リアルタイムのデータがあります。
我々は使用することができます達成するために+ BeautifulSoupを要求します。
Requests负责网页的请求,BeautifulSoup负责对请求完的网页进行网页解析。
下面的代码是一个爬取应用宝中理财类APP的名称的爬虫代码实现

复制代码
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
import time
class SyncCrawlSjqq(object):
    def parser(self,url):
        req = requests.get(url)
        soup = BeautifulSoup(req.text,"lxml")
        name_list = soup.find(class_='app-list clearfix')('li')
        names=[]
        for name in name_list:
            app_name = name.find('a',class_="name ofh").text
            names.append(app_name)
        return names
if __name__ == '__main__':
    syncCrawlSjqq = SyncCrawlSjqq()
    t1 = time.time()
    url = "https://sj.qq.com/myapp/category.htm?orgame=1&categoryId=114"
    print(syncCrawlSjqq.parser(url))
    t2 = time.time()
    print('一般方法,总共耗时:%s' % (t2 - t1))
复制代码
 

运行结果如下

D:\python\Python3\python.exe D:/project/python/zj_scrapy/zj_scrapy/SyncCrawlSjqq.py

['宜人贷借款', '大智慧', '中国建设银行', '同花顺手机炒股股票软件', '随手记理财记账', '平安金管家', '翼支付', '第一理财', '平安普惠', '51信用卡管家', '借贷宝', '卡牛信用管家', '省呗', '平安口袋银行', '拍拍贷借款', '简理财', '中国工商银行', 'PPmoney出借', '360借条', '京东金融', '招商银行', '云闪付', '腾讯自选股(腾讯官方炒股软件)', '鑫格理财', '中国银行手机银行', '风车理财', '招商银行掌上生活', '360贷款导航', '农行掌上银行', '现金巴士', '趣花分期', '挖财记账', '闪银', '极速现金侠', '小花钱包', '闪电借款', '光速贷款', '借花花贷款', '捷信金融', '分期乐']

一般方法,总共耗时:0.3410000801086426

 

Process finished with exit code 0

 

我们可以采用flask web 框架对上面的方法做一个http 服务,然后上面的爬虫就变成了http爬虫服务了。调用http服务后,服务实时返回爬取的数据给http请求调用方,示例参考代码如下:

复制代码
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup
from flask import Flask, request, Response
import json
app = Flask(__name__)
class SyncCrawlSjqq(object):
    def parser(self,url):
        req = requests.get(url)
        soup = BeautifulSoup(req.text,"lxml")
        name_list = soup.find(class_='app-list clearfix')('li')
        names=[]
        for name in name_list:
            app_name = name.find('a',class_="name ofh").text
            names.append(app_name)
        return names
@app.route('/getSyncCrawlSjqqResult',methods = ['GET'])
def getSyncCrawlSjqqResult():
    syncCrawlSjqq=SyncCrawlSjqq()
    return Response(json.dumps(syncCrawlSjqq.parser(request.args.get("url"))),mimetype="application/json")
if __name__ == '__main__':
    app.run(port=3001,host='0.0.0.0',threaded=True)
    #app.run(port=3001,host='0.0.0.0',processes=3)
复制代码

 

并发方法可以使用多线程来加速一般方法,我们使用的并发模块为concurrent.futures模块,设置多线程的个数为20个(实际不一定能达到,视计算机而定)。实现的示例代码如下:

复制代码
# -*- coding: utf-8 -*-
from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED

import requests
from bs4 import BeautifulSoup
import time
class SyncCrawlSjqqMultiProcessing(object):
    def parser(self,url):
        req = requests.get(url)
        soup = BeautifulSoup(req.text,"lxml")
        name_list = soup.find(class_='app-list clearfix')('li')
        names=[]
        for name in name_list:
            app_name = name.find('a',class_="name ofh").text
            names.append(app_name)
        return names
if __name__ == '__main__':
    url = "https://sj.qq.com/myapp/category.htm?orgame=1&categoryId=114"
    executor = ThreadPoolExecutor(max_workers=20)
    syncCrawlSjqqMultiProcessing = SyncCrawlSjqqMultiProcessing()
    t1 = time.time()
    future_tasks=[executor.submit(print(syncCrawlSjqqMultiProcessing.parser(url)))]
    wait(future_tasks, return_when=ALL_COMPLETED)
    t2 = time.time()
    print('一般方法,总共耗时:%s' % (t2 - t1))
复制代码

 

 

运行结果如下:

D:\python\Python3\python.exe D:/project/python/zj_scrapy/zj_scrapy/SyncCrawlSjqqMultiProcessing.py

['宜人贷借款', '大智慧', '中国建设银行', '同花顺手机炒股股票软件', '随手记理财记账', '平安金管家', '翼支付', '第一理财', '平安普惠', '51信用卡管家', '借贷宝', '卡牛信用管家', '省呗', '平安口袋银行', '拍拍贷借款', '简理财', '中国工商银行', 'PPmoney出借', '360借条', '京东金融', '招商银行', '云闪付', '腾讯自选股(腾讯官方炒股软件)', '鑫格理财', '中国银行手机银行', '风车理财', '招商银行掌上生活', '360贷款导航', '农行掌上银行', '现金巴士', '趣花分期', '挖财记账', '闪银', '极速现金侠', '小花钱包', '闪电借款', '光速贷款', '借花花贷款', '捷信金融', '分期乐']

一般方法,总共耗时:0.3950002193450928

 

Process finished with exit code 0

比如单线程运行,多线程在爬虫时明显会要快很多。

おすすめ

転載: www.cnblogs.com/xingxia/p/python_architecture2.html