目錄
- 1.預(yù)備知識(shí)
- 2.抓取CSDN數(shù)據(jù)接口
- 2.1 查看CSDN搜索引擎主頁(yè)
- 2.2測(cè)試CSDN搜索引擎的功能
- 2.3查看更多相關(guān)文章的信息
- 2.4抓取ajax異步請(qǐng)求數(shù)據(jù)
- 2.5 分析url地址
- 3. 使用scrapy爬取CSDN數(shù)據(jù)接口
- 3.1 start_requests
- 3.2使用parse函數(shù)提取數(shù)據(jù)
- 3.3保存成CSV文件
- 3.4 運(yùn)行結(jié)果
- 4. 效果展示
1.預(yù)備知識(shí)
python語(yǔ)言,scrapy爬蟲(chóng)基礎(chǔ),json模塊,flask后端
2.抓取CSDN數(shù)據(jù)接口
使用谷歌抓包工具抓取CSDN搜索引擎的接口
2.1 查看CSDN搜索引擎主頁(yè)
查看CSDN搜索引擎主頁(yè)https://so.csdn.net/,截圖如下:
2.2測(cè)試CSDN搜索引擎的功能
測(cè)試CSDN搜索引擎的功能,嘗試輸入?yún)?shù)之后,查看返回的文章信息列表,測(cè)試如下:
經(jīng)過(guò)測(cè)試發(fā)現(xiàn),CSDN搜索引擎的主要功能是,搜索所有跟python有關(guān)的文章,然后根據(jù)文章熱度,點(diǎn)贊量,留言數(shù)進(jìn)行一個(gè)綜合排序,展示給用戶排序后的文章結(jié)果。這樣來(lái)說(shuō),我們的主要任務(wù)就是利用抓包抓取到前后端傳輸數(shù)據(jù)的接口,通過(guò)接口,來(lái)實(shí)現(xiàn)整個(gè)搜索引擎的效果。
2.3查看更多相關(guān)文章的信息
讓我們把前端滑輪移到最后,發(fā)現(xiàn)并沒(méi)有頁(yè)數(shù)的標(biāo)簽,而是通過(guò)自動(dòng)加載數(shù)據(jù)來(lái)呈現(xiàn),效果如下:
在不刷新整個(gè)頁(yè)面的基礎(chǔ)上加載新的數(shù)據(jù),這很容易讓我們聯(lián)想到ajax異步請(qǐng)求。
異步請(qǐng)求通常就是利用ajax技術(shù),能在不更新整個(gè)頁(yè)面的前提下維護(hù)數(shù)據(jù)。這使得Web應(yīng)用程序更為迅捷地回應(yīng)用戶動(dòng)作,并避免了在網(wǎng)絡(luò)上發(fā)送那些沒(méi)有改變的信息。
接下來(lái)我們嘗試?yán)霉雀铻g覽器抓取異步請(qǐng)求的信息。
2.4抓取ajax異步請(qǐng)求數(shù)據(jù)
使用谷歌瀏覽器抓取ajax異步請(qǐng)求數(shù)據(jù)
為了避免干擾因素,我們?cè)谧グ靶枰c(diǎn)擊clear按鈕,清空當(dāng)前的抓包記錄
將滑塊移動(dòng)到最后,使前端頁(yè)面自動(dòng)加載數(shù)據(jù),分析數(shù)據(jù)加載時(shí)抓取到的數(shù)據(jù)包信息。通過(guò)多次分析驗(yàn)證,發(fā)現(xiàn)結(jié)果有一個(gè)get請(qǐng)求攜帶著大量的刷新時(shí)的數(shù)據(jù)。如下圖所示:
是JSON格式的數(shù)據(jù),這里簡(jiǎn)單介紹一下JSON格式的數(shù)據(jù)。
JSON 是前后端傳輸數(shù)據(jù)最常見(jiàn)的用法之一,是從 web 服務(wù)器上讀取 JSON 數(shù)據(jù)(作為文件或作為 HttpRequest),將 JSON 數(shù)據(jù)轉(zhuǎn)換為 JavaScript 對(duì)象,然后在網(wǎng)頁(yè)中使用該數(shù)據(jù)。
通過(guò)分析,我們可以發(fā)現(xiàn)數(shù)據(jù)是存放在result_vos列表下的各個(gè)字典中的,我們可以使用循環(huán),然后通過(guò)dict[“xxx”]的方式來(lái)提取數(shù)據(jù)。
2.5 分析url地址
我們發(fā)現(xiàn)這個(gè)GET請(qǐng)求攜帶了大量的未知參數(shù),通過(guò)經(jīng)驗(yàn)分析,以及英語(yǔ)首字母,我們可以猜測(cè)P是page(頁(yè)),Q是query(查詢)的意思,其他xxx=-1應(yīng)該是默認(rèn)值,我們暫時(shí)按照這個(gè)猜測(cè)進(jìn)行刪減參數(shù)。
測(cè)試結(jié)果截圖:
通過(guò)測(cè)試,發(fā)現(xiàn)猜測(cè)正確,只保留了q、t、p三個(gè)參數(shù),依然可以訪問(wèn)到傳輸?shù)臄?shù)據(jù)內(nèi)容(事實(shí)上,這里t參數(shù)也可以刪除,同學(xué)們可以自行測(cè)試)
這樣,這條url對(duì)應(yīng)的重要參數(shù)都分析出來(lái)了,鏈接如下:
https://so.csdn.net/api/v3/search?q=pythont=allp=2
跟我們猜測(cè)的一樣,q是代表查詢,p是代表page,這樣我們已經(jīng)獲取到CSDN引擎的核心API,我們可以通過(guò)這條API來(lái)實(shí)現(xiàn)搜索引擎的功能。
至此,抓包分析過(guò)程結(jié)束。
3. 使用scrapy爬取CSDN數(shù)據(jù)接口
3.1 start_requests
使用start_requests函數(shù)進(jìn)行構(gòu)造20頁(yè)的url列表。
這里start_requests方法必須返回一個(gè)可迭代對(duì)象(iterable)。該對(duì)象包含了spider用于抓取的第一個(gè)Request。
當(dāng)spider開(kāi)始抓取并且未指定start_urls時(shí),該方法將會(huì)被調(diào)用。該方法僅僅會(huì)被scrapy調(diào)用一次,因此可以將其實(shí)現(xiàn)為url生成器。
使用scrapy.Request可以發(fā)送一個(gè)GET請(qǐng)求,傳送到指定的函數(shù)進(jìn)行處理。
詳細(xì)代碼操作如下:
# 重寫(xiě)start_urls的方法
def start_requests(self):
# 這里是控制CSDN的文章類(lèi)型
input_text = input('請(qǐng)輸入要爬取的CSDN類(lèi)型:')
# 是控制爬取文章頁(yè)數(shù)
for i in range(1,31):
start_url = 'https://so.csdn.net/api/v3/search?q={}p={}'.format(input_text,i)
yield scrapy.Request(
url=start_url,
callback=self.parse
)
3.2使用parse函數(shù)提取數(shù)據(jù)
這里需要掌握幾個(gè)重要的方法應(yīng)用
- response.text 請(qǐng)求返回的響應(yīng)的字符串格式的數(shù)據(jù)
- json.loads() loads方法是將str轉(zhuǎn)化為dict格式數(shù)據(jù)
- json.dumps() dumps方法是將dict格式的數(shù)據(jù)轉(zhuǎn)化為str
具體代碼操作如下:
data_dict = json.loads(response.text)
使用循環(huán)遍歷json數(shù)據(jù)中的各個(gè)具體直播間數(shù)據(jù)的信息,新建一個(gè)item字典進(jìn)行數(shù)據(jù)存儲(chǔ),然后使用yield傳遞給引擎進(jìn)行相應(yīng)的處理
代碼操作如下:
def parse(self, response):
# response.request.headers
print(response.request.headers)
data_dict = json.loads(response.text)
for data in data_dict['result_vos']:
item = {}
# 標(biāo)題
item['title'] = data['title'].replace('em>','').replace('/em>','')
# 作者
item['author_label'] = data['nickname']
# 瀏覽量
item['view'] = data['view']
# 點(diǎn)贊量
item['zan'] = data['digg']
# 地址鏈接
item['link_url'] = data['url']
3.3保存成CSV文件
import csv
定義csv文件需要的列標(biāo)題
headers = ['title','author_label','view','zan','jianjie' ,'link_url']
每次調(diào)用pipline的時(shí)候,都會(huì)運(yùn)行一遍
class Day02Pipeline:
def process_item(self, item, spider):
文件默認(rèn)保存到當(dāng)前目錄下的douyu.csv中
這里a是追加操作
with open('csdn.csv', 'a', encoding='utf-8', newline='') as fa:
保存headers規(guī)定的列名內(nèi)容
writer = csv.DictWriter(fa, headers)
writer.writerow(item)
print(item)
return item
3.4 運(yùn)行結(jié)果
最后,我們來(lái)查看一下運(yùn)行結(jié)果,以及保存好的csv文件
終端運(yùn)行結(jié)果如下:
至此,爬蟲(chóng)實(shí)驗(yàn)結(jié)束。
4. 效果展示
4.1 flask后端展示
搭建過(guò)程略
(入門(mén)級(jí)搭建,沒(méi)有用企業(yè)級(jí)開(kāi)發(fā)流程,后期可以考慮出flask的教程)
展示結(jié)構(gòu)如下:
flask入門(mén)可自行百度
4.2 效果展示
點(diǎn)擊搜索后:
左上角的搜索頁(yè)面是入口頁(yè)面。
好了,這樣簡(jiǎn)易版的搜索引擎就搭建好了。更多相關(guān)scrapy+flask+html搜索引擎內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- Mysql實(shí)現(xiàn)簡(jiǎn)易版搜索引擎的示例代碼
- MySQL全文索引實(shí)現(xiàn)簡(jiǎn)單版搜索引擎實(shí)例代碼
- 詳細(xì)介紹基于MySQL的搜索引擎MySQL-Fullltext
- python基于搜索引擎實(shí)現(xiàn)文章查重功能
- Python實(shí)戰(zhàn)之手寫(xiě)一個(gè)搜索引擎
- Python大批量搜索引擎圖像爬蟲(chóng)工具詳解
- 360搜索引擎自動(dòng)收錄php改寫(xiě)方案
- php記錄搜索引擎爬行記錄的實(shí)現(xiàn)代碼
- Python無(wú)損音樂(lè)搜索引擎實(shí)現(xiàn)代碼
- 基于 Mysql 實(shí)現(xiàn)一個(gè)簡(jiǎn)易版搜索引擎