經(jīng)過前面四章的學習,我們已經(jīng)可以使用Requests庫、Beautiful Soup庫和Re庫,編寫基本的Python爬蟲程序了。那么這一章就來學習一個專業(yè)的網(wǎng)絡爬蟲框架--Scrapy。沒錯,是框架,而不是像前面介紹的函數(shù)功能庫。

創(chuàng)新互聯(lián)建站服務項目包括西吉網(wǎng)站建設、西吉網(wǎng)站制作、西吉網(wǎng)頁制作以及西吉網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,西吉網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到西吉省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
Scrapy是一個快速、功能強大的網(wǎng)絡爬蟲框架。
可能大家還不太了解什么是框架,爬蟲框架其實是實現(xiàn)爬蟲功能的一個軟件結(jié)構(gòu)和功能組件的集合。
簡而言之, Scrapy就是一個爬蟲程序的半成品,可以幫助用戶實現(xiàn)專業(yè)的網(wǎng)絡爬蟲。
使用Scrapy框架,不需要你編寫大量的代碼,Scrapy已經(jīng)把大部分工作都做好了,允許你調(diào)用幾句代碼便自動生成爬蟲程序,可以節(jié)省大量的時間。
當然,框架所生成的代碼基本是一致的,如果遇到一些特定的爬蟲任務時,就不如自己使用Requests庫搭建來的方便了。
PyCharm安裝
測試安裝:
出現(xiàn)框架版本說明安裝成功。
掌握Scrapy爬蟲框架的結(jié)構(gòu)是使用好Scrapy的重中之重!
先上圖:
整個結(jié)構(gòu)可以簡單地概括為: “5+2”結(jié)構(gòu)和3條數(shù)據(jù)流
5個主要模塊(及功能):
(1)控制所有模塊之間的數(shù)據(jù)流。
(2)可以根據(jù)條件觸發(fā)事件。
(1)根據(jù)請求下載網(wǎng)頁。
(1)對所有爬取請求進行調(diào)度管理。
(1)解析DOWNLOADER返回的響應--response。
(2)產(chǎn)生爬取項--scraped item。
(3)產(chǎn)生額外的爬取請求--request。
(1)以流水線方式處理SPIDER產(chǎn)生的爬取項。
(2)由一組操作順序組成,類似流水線,每個操作是一個ITEM PIPELINES類型。
(3)清理、檢查和查重爬取項中的HTML數(shù)據(jù)并將數(shù)據(jù)存儲到數(shù)據(jù)庫中。
2個中間鍵:
(1)對Engine、Scheduler、Downloader之間進行用戶可配置的控制。
(2)修改、丟棄、新增請求或響應。
(1)對請求和爬取項進行再處理。
(2)修改、丟棄、新增請求或爬取項。
3條數(shù)據(jù)流:
(1):圖中數(shù)字 1-2
1:Engine從Spider處獲得爬取請求--request。
2:Engine將爬取請求轉(zhuǎn)發(fā)給Scheduler,用于調(diào)度。
(2):圖中數(shù)字 3-4-5-6
3:Engine從Scheduler處獲得下一個要爬取的請求。
4:Engine將爬取請求通過中間件發(fā)送給Downloader。
5:爬取網(wǎng)頁后,Downloader形成響應--response,通過中間件發(fā)送給Engine。
6:Engine將收到的響應通過中間件發(fā)送給Spider處理。
(3):圖中數(shù)字 7-8-9
7:Spider處理響應后產(chǎn)生爬取項--scraped item。
8:Engine將爬取項發(fā)送給Item Pipelines。
9:Engine將爬取請求發(fā)送給Scheduler。
任務處理流程:從Spider的初始爬取請求開始爬取,Engine控制各模塊數(shù)據(jù)流,不間斷從Scheduler處獲得爬取請求,直至請求為空,最后到Item Pipelines存儲數(shù)據(jù)結(jié)束。
作為用戶,只需配置好Scrapy框架的Spider和Item Pipelines,也就是數(shù)據(jù)流的入口與出口,便可完成一個爬蟲程序的搭建。Scrapy提供了簡單的爬蟲命令語句,幫助用戶一鍵配置剩余文件,那我們便來看看有哪些好用的命令吧。
Scrapy采用命令行創(chuàng)建和運行爬蟲
PyCharm打開Terminal,啟動Scrapy:
Scrapy基本命令行格式:
具體常用命令如下:
下面用一個例子來學習一下命令的使用:
1.建立一個Scrapy爬蟲工程,在已啟動的Scrapy中繼續(xù)輸入:
執(zhí)行該命令,系統(tǒng)會在PyCharm的工程文件中自動創(chuàng)建一個工程,命名為pythonDemo。
2.產(chǎn)生一個Scrapy爬蟲,以教育部網(wǎng)站為例:
命令生成了一個名為demo的spider,并在Spiders目錄下生成文件demo.py。
命令僅用于生成demo.py文件,該文件也可以手動生成。
觀察一下demo.py文件:
3.配置產(chǎn)生的spider爬蟲,也就是demo.py文件:
4.運行爬蟲,爬取網(wǎng)頁:
如果爬取成功,會發(fā)現(xiàn)在pythonDemo下多了一個t20210816_551472.html的文件,我們所爬取的網(wǎng)頁內(nèi)容都已經(jīng)寫入該文件了。
以上就是Scrapy框架的簡單使用了。
Request對象表示一個HTTP請求,由Spider生成,由Downloader執(zhí)行。
Response對象表示一個HTTP響應,由Downloader生成,有Spider處理。
Item對象表示一個從HTML頁面中提取的信息內(nèi)容,由Spider生成,由Item Pipelines處理。Item類似于字典類型,可以按照字典類型來操作。
xpath也許只能提取html元素?
建議你先把content保存到本地文件,看看需要的內(nèi)容有沒有下載下來。
你這個屬于script內(nèi)容,看看直接正則能獲得嗎?
一個借口幾萬條數(shù)據(jù)但是只返回十條_爬蟲實踐之爬取10000條菜譜數(shù)據(jù)
2020-12-03 06:37:24
weixin_39990029
碼齡5年
關注
be22f93fc7bbc7cbdd62166579a1fd22.png
爬蟲實踐之XX行代碼爬取10000菜譜數(shù)據(jù)
什么是爬蟲
爬蟲:又叫做 網(wǎng)絡蜘蛛,是一段自動抓取互聯(lián)網(wǎng)信息的程序,從互聯(lián)網(wǎng)上抓取對于我們有價值的信息。
點擊這里了解Python爬蟲介紹
如何合法地爬蟲
有些網(wǎng)站不允許網(wǎng)絡爬蟲,或是對可爬取的內(nèi)容做了限制,一個網(wǎng)站的爬蟲協(xié)議可通過訪問該網(wǎng)站的robots.txt文件獲得
以豆瓣網(wǎng)為例
訪問該網(wǎng)址(),可了解到豆瓣的爬蟲協(xié)議如下
1fe03008a450885dc6da49785543e75c.png
可以看到,豆瓣對于不同的訪問者有不同的訪問限制,其中對于用戶名為 Wandoujia Spider的訪問者,豆瓣不允許訪問。
我用到的菜譜網(wǎng)站對爬蟲無限制,所以爬蟲是合法的。
e4025d9f5d8b96388efa942e0255d1f9.png
本篇特色
連續(xù)爬取10000個網(wǎng)頁
引入第三方庫
import requests #發(fā)送請求
import re #正則表達式,用于提取網(wǎng)頁數(shù)據(jù)
import winsound #提醒程序運行結(jié)束
import time #計算程序運行時間
如果沒有安裝這些第三方庫,可以在命令提示符中輸入如下代碼,進行下載
pip install requests,re,winsound,time
爬蟲的三個步驟
獲取要爬取的所有網(wǎng)頁的網(wǎng)址
提取網(wǎng)頁內(nèi)容中的有用信息
信息導出
每個步驟對應一個函數(shù)
Step_1 獲取要爬取的所有網(wǎng)頁的網(wǎng)址
首先我們打開該網(wǎng)址,查看它的源代碼
0f0eb8b89c9bf17460bca4d47f017bab.png
365621d25c80f92834853350c083a545.png
網(wǎng)頁源代碼
觀察發(fā)現(xiàn)每道菜對應的網(wǎng)址在這個目錄下
9d729b843df3a746d70ea7af31a1d962.png
用正則表達式獲得該網(wǎng)址,寫入列表中
由于每一個網(wǎng)頁只有十道菜,點擊下一頁后發(fā)現(xiàn)網(wǎng)頁的變化規(guī)律為換頁時網(wǎng)址只有數(shù)字改變
d342d8422e16c48c9600a47a45a6d1c9.png
可以看到最多有1000頁,也就是有10000道菜
fb279b42fcdd3cecf7cda79ba4a8ae53.png
使用循環(huán),將每一頁的菜對應的網(wǎng)址都寫入列表,每一次寫入時寫入一行列表,多次寫入后,形成一個二維的列表,前兩頁的菜譜網(wǎng)址在二維列表中顯示如下:
31e3755dc8b45ec6f4dac3c05f261539.png
代碼如下
all_url = [] #創(chuàng)建一個數(shù)組用于存儲網(wǎng)頁地址
def get_all_url(n): #這個函數(shù)用于獲得網(wǎng)頁中的菜的全部網(wǎng)址
if(n==1):
url = ""
else:
url=''%n #%s相當于C語言中的%s,表示格式化一個對象為字符,同理%d表示格式化一個對象為整數(shù)
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36" }
response = requests.get(url,headers=headers) #訪問網(wǎng)頁
response.encoding = "utf-8" #設置接收編碼格式
pattern = re.compile(r'a target="_blank" href="([a-zA-z]+://[^s]*)"', re.S)
#正則表達式提取網(wǎng)頁中的網(wǎng)址,re.S表示在整個文本中進行匹配,如果不加re.S,將只在一行進行匹配
result = pattern.findall(response.text) #獲取的網(wǎng)頁結(jié)果存儲到result里
all_url.append(result[0:10])#由于每頁只有十道菜,result中只有前十條對應的是菜的網(wǎng)址,故我們只添加前十條
return all_url #作為返回值返回這個列表
關于headers的說明
在使用python爬蟲爬取數(shù)據(jù)的時候,經(jīng)常會遇到一些網(wǎng)站的反爬蟲措施,一般就是針對于headers中的User-Agent,如果沒有對headers進行設置,User-Agent會聲明自己是python腳本,而如果網(wǎng)站有反爬蟲的想法的話,必然會拒絕這樣的連接。而修改headers可以將自己的爬蟲腳本偽裝成瀏覽器的正常訪問,來避免這一問題。 點擊這里了解詳情
關于編碼格式utf-8 的說明
utf-8,可以編碼中文,大部分python編譯器都默認編碼方式為utf-8 點擊這里了解詳情
Step_2 提取網(wǎng)頁中的有用信息
打開一道菜的網(wǎng)址,查看源代碼,尋找我們需要的信息在哪里,然后用正則表達式獲取,流程與上個函數(shù)獲取網(wǎng)址相同
主輔料信息在這里
c0ddfd3110775bb8b71759f6927f26d4.png
特征信息在這里(包括做法和口味)
38c99c1a51137debcafe38ae3122e19a.png
def get_info(resp,output):
name_pattern = re.compile(r'h1(.*)/h1')# 正則表達式獲取菜名信息
food_pattern = re.compile(r'span class="t"(.*)/spanspan class="a"(.*)/span/a/div')# 正則表達式獲得主料信息
fixing_pattern = re.compile(r'div class="c_mtr_li"span class="t1"(.*)/spanspan class="a"(.*)/span/div') # 正則表達式獲得輔料信息
fearture1_pattern = re.compile(r'div class="cpargs cpargs2"div class="i"/div(.)/div')# 正則表達式獲得特征_1
fearture2_pattern = re.compile(r'div class="cpargs cpargs3"div class="i"/div(.*)/div')# 正則表達式獲得特征_2
name = name_pattern.findall(resp.text) # 提取菜名信息
food = food_pattern.findall(resp.text)# 提取主料信息
fixing = fixing_pattern.findall(resp.text)#提取輔料信息
fearture1 = fearture1_pattern.findall(resp.text) #提取特征_1
fearture2 = fearture2_pattern.findall(resp.text)#提取特征_2
output.write(str(name))#將菜名寫入output文件,write函數(shù)不能寫int類型的參數(shù),所以使用str()轉(zhuǎn)化
output.write('t')#進入下一個單元格
output.write(str(fearture1))#將特征_1寫入output文件
output.write('t')#進入下一個單元格
output.write(str(fearture2))#將特征_2寫入output文件
output.write('t')#進入下一個單元格
for i in range(len(food)):
for j in range(len(food[i])):
output.write(str(food[i][j])) #寫入主料
output.write('t')
if(len(food)11):
output.write('t'*2*(11-len(food))) #每道菜的主料數(shù)目不同,該行代碼可使表格內(nèi)容對齊
for i in range(len(fixing)):
for j in range(len(fixing[i])):
output.write(str(fixing[i][j])) #寫入輔料
output.write('t')
output.write('n') #換行
Step_3 信息導出
def spider():
output = open('E:programingpython蘇菜_2.xls','w',encoding='utf-8')#創(chuàng)建一個excel文件,編碼格式為utf-8
output.write('名稱t做法t特色t主料')#寫入標題欄
output.write('t'*22)#使內(nèi)容對齊
output.write('輔料n')#寫入標題欄
for i in range(len(all_url)):
for j in range(len(all_url[i])):
url2=all_url[i][j]
response = requests.get(url2)#逐個訪問網(wǎng)頁,獲得數(shù)據(jù)
response.encoding = "utf-8" #設置接收編碼格式
get_info(response,output)#處理數(shù)據(jù),提取信息
output.close()#關閉文件
主函數(shù)
time_start = time.time()#記錄程序開始時間
for i in range(1,2):#逐頁獲取菜譜網(wǎng)頁信息
get_all_url(i)
spider()#進行提取處理并導出
duration = 1000#提示音時長,1000毫秒 = 1秒
freq = 440 #提示音頻率
time_end=time.time()#記錄程序結(jié)束時間
print('totally cost',time_end-time_start)#打印程序運行時間
winsound.Beep(freq,duration*10) #響鈴提示程序結(jié)束
經(jīng)實驗,爬取10000條代碼需要用時3453秒左右
e8b6c8637980d2aef9587711c7084a5f.png
最后獲得的數(shù)據(jù)如下
97a8662cf048844850658aef841e04c3.png
寫在后面
我是一個C語言上不了80的小白,全靠某度和某歌東拼西湊我的這個程序,在代碼風格與寫作等方面存在不可避免地會有一些錯誤和不足的地方,希望大家多多與我交流,多多批評指教我。
分享題目:python爬蟲函數(shù) python爬蟲詳解
分享地址:http://chinadenli.net/article46/dojighg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、、建站公司、企業(yè)建站、網(wǎng)站排名、域名注冊
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)