"

我們接著關於爬蟲平臺的架構實現和框架的選型(一)繼續來講爬蟲框架的架構實現和框架的選型。

前面介紹了scrapy的基本操作,下面介紹下scrapy爬蟲的內部實現架構如下圖

"

我們接著關於爬蟲平臺的架構實現和框架的選型(一)繼續來講爬蟲框架的架構實現和框架的選型。

前面介紹了scrapy的基本操作,下面介紹下scrapy爬蟲的內部實現架構如下圖

教你實現python爬蟲平臺的架構和框架的選型(二)

1、Spiders(爬蟲):它負責處理所有Responses,從中分析提取數據,獲取Item字段需要的數據,並將需要跟進的URL提交給引擎,再次進入Scheduler(調度器)

2、Engine(引擎):負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數據傳遞等。

3、Scheduler(調度器):它負責接受引擎發送過來的Request請求,並按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎。

4、Downloader(下載器):負責下載Scrapy Engine(引擎)發送的所有Requests請求,並將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理

5、ItemPipeline(管道):它負責處理Spider中獲取到的Item,並進行進行後期處理(詳細分析、過濾、存儲等)的地方.

6、Downloader Middlewares(下載中間件):你可以當作是一個可以自定義擴展下載功能的組件。

7、Spider Middlewares(Spider中間件):你可以理解為是一個可以自定擴展和操作引擎和Spider中間通信的功能組件(比如進入Spider的Responses;和從Spider出去的Requests)。

Scrapy 爬蟲整過處理的過程如下:

"

我們接著關於爬蟲平臺的架構實現和框架的選型(一)繼續來講爬蟲框架的架構實現和框架的選型。

前面介紹了scrapy的基本操作,下面介紹下scrapy爬蟲的內部實現架構如下圖

教你實現python爬蟲平臺的架構和框架的選型(二)

1、Spiders(爬蟲):它負責處理所有Responses,從中分析提取數據,獲取Item字段需要的數據,並將需要跟進的URL提交給引擎,再次進入Scheduler(調度器)

2、Engine(引擎):負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數據傳遞等。

3、Scheduler(調度器):它負責接受引擎發送過來的Request請求,並按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎。

4、Downloader(下載器):負責下載Scrapy Engine(引擎)發送的所有Requests請求,並將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理

5、ItemPipeline(管道):它負責處理Spider中獲取到的Item,並進行進行後期處理(詳細分析、過濾、存儲等)的地方.

6、Downloader Middlewares(下載中間件):你可以當作是一個可以自定義擴展下載功能的組件。

7、Spider Middlewares(Spider中間件):你可以理解為是一個可以自定擴展和操作引擎和Spider中間通信的功能組件(比如進入Spider的Responses;和從Spider出去的Requests)。

Scrapy 爬蟲整過處理的過程如下:

教你實現python爬蟲平臺的架構和框架的選型(二)

每一個用scrapy創建的爬蟲項目都會生成一個middlewares.py文件,在這個文件中定義了兩個處理中間件SpiderMiddleware和DownloaderMiddleware,這兩個中間件分別負責請求前的過濾和請求後的response過濾。

上面介紹了基於scrapy的異步爬蟲,下面介紹一下實時爬蟲,也就是爬蟲數據實時返回。

我們可以用requests+BeautifulSoup來進行實現。

Requests負責網頁的請求,BeautifulSoup負責對請求完的網頁進行網頁解析。

下面的代碼是一個爬取應用寶中理財類APP的名稱的爬蟲代碼實現

"

我們接著關於爬蟲平臺的架構實現和框架的選型(一)繼續來講爬蟲框架的架構實現和框架的選型。

前面介紹了scrapy的基本操作,下面介紹下scrapy爬蟲的內部實現架構如下圖

教你實現python爬蟲平臺的架構和框架的選型(二)

1、Spiders(爬蟲):它負責處理所有Responses,從中分析提取數據,獲取Item字段需要的數據,並將需要跟進的URL提交給引擎,再次進入Scheduler(調度器)

2、Engine(引擎):負責Spider、ItemPipeline、Downloader、Scheduler中間的通訊,信號、數據傳遞等。

3、Scheduler(調度器):它負責接受引擎發送過來的Request請求,並按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎。

4、Downloader(下載器):負責下載Scrapy Engine(引擎)發送的所有Requests請求,並將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理

5、ItemPipeline(管道):它負責處理Spider中獲取到的Item,並進行進行後期處理(詳細分析、過濾、存儲等)的地方.

6、Downloader Middlewares(下載中間件):你可以當作是一個可以自定義擴展下載功能的組件。

7、Spider Middlewares(Spider中間件):你可以理解為是一個可以自定擴展和操作引擎和Spider中間通信的功能組件(比如進入Spider的Responses;和從Spider出去的Requests)。

Scrapy 爬蟲整過處理的過程如下:

教你實現python爬蟲平臺的架構和框架的選型(二)

每一個用scrapy創建的爬蟲項目都會生成一個middlewares.py文件,在這個文件中定義了兩個處理中間件SpiderMiddleware和DownloaderMiddleware,這兩個中間件分別負責請求前的過濾和請求後的response過濾。

上面介紹了基於scrapy的異步爬蟲,下面介紹一下實時爬蟲,也就是爬蟲數據實時返回。

我們可以用requests+BeautifulSoup來進行實現。

Requests負責網頁的請求,BeautifulSoup負責對請求完的網頁進行網頁解析。

下面的代碼是一個爬取應用寶中理財類APP的名稱的爬蟲代碼實現

教你實現python爬蟲平臺的架構和框架的選型(二)

# -*- 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

比如單線程運行,多線程在爬蟲時明顯會要快很多。

"

相關推薦

推薦中...