什么是爬蟲(chóng)?
實(shí)踐來(lái)源于理論,做爬蟲(chóng)前肯定要先了解相關(guān)的規(guī)則和原理,要知道互聯(lián)網(wǎng)可不是法外之地,你一頓爬蟲(chóng)騷操作搞不好哪天就…
?首先,咱先看下爬蟲(chóng)的定義:網(wǎng)絡(luò)爬蟲(chóng)(又稱(chēng)為網(wǎng)頁(yè)蜘蛛,網(wǎng)絡(luò)機(jī)器人,在FOAF社區(qū)中間,更經(jīng)常的稱(chēng)為網(wǎng)頁(yè)追逐者),是一種按照一定的規(guī)則,自動(dòng)地抓取萬(wàn)維網(wǎng)信息的程序或者腳本。一句話(huà)概括就是網(wǎng)上信息搬運(yùn)工。
我們?cè)賮?lái)看下爬蟲(chóng)應(yīng)該遵循的規(guī)則:robots協(xié)議是一種存放于網(wǎng)站根目錄下的ASCII編碼的文本文件,它通常告訴網(wǎng)絡(luò)搜索引擎的漫游器(又稱(chēng)網(wǎng)絡(luò)蜘蛛),此網(wǎng)站中的哪些內(nèi)容是不應(yīng)被搜索引擎的漫游器獲取的,哪些是可以被漫游器獲取的。一句話(huà)概括就是告訴你哪些東西能爬哪些不能爬。
了解了定義和規(guī)則,最后就是熟悉爬蟲(chóng)的基本原理了,很簡(jiǎn)單,作為一名靈魂畫(huà)手,我畫(huà)個(gè)示意圖給你看下就明白了。
?(⊙o⊙)…尷尬,鼠標(biāo)寫(xiě)字咋這么丑,都不好意思說(shuō)自己學(xué)過(guò)書(shū)法,好一個(gè)臉字打得呱呱響。
項(xiàng)目背景
理論部分差不多講完了,有些小朋友估計(jì)要嫌我啰嗦了,那就不廢話(huà),直接講實(shí)操部分。本次爬蟲(chóng)小項(xiàng)目是應(yīng)朋友需求,爬取中國(guó)木材價(jià)格指數(shù)網(wǎng)中的紅木價(jià)格數(shù)據(jù),方便撰寫(xiě)紅木研究報(bào)告。網(wǎng)站長(zhǎng)這樣:
?所需字段已用紅框標(biāo)記,數(shù)據(jù)量粗略看了下,1751頁(yè)共5萬(wàn)多條記錄,如果你妄想復(fù)制粘貼的話(huà),都不知道粘到猴年馬月了。而python只要運(yùn)行幾分鐘就能把所有數(shù)據(jù)保存到你的excel里,是不是很舒服?
項(xiàng)目實(shí)戰(zhàn)
工具:PyCharm
Python版本:Python 3.7
瀏覽器:Chrome (推薦)
對(duì)于第一次寫(xiě)爬蟲(chóng)的朋友可能覺(jué)得很麻煩,咱不慌,由淺入深,先爬一頁(yè)數(shù)據(jù)試試嘛。
一.爬取一頁(yè)
首先,我們需要簡(jiǎn)單分析下網(wǎng)頁(yè)結(jié)構(gòu),鼠標(biāo)右鍵點(diǎn)擊檢查,然后點(diǎn)擊Network,刷新網(wǎng)頁(yè),繼續(xù)點(diǎn)擊Name列表中的第一個(gè)。我們發(fā)現(xiàn)此網(wǎng)站的請(qǐng)求方式為GET,請(qǐng)求頭Headers反映用戶(hù)電腦系統(tǒng)、瀏覽器版本等信息。
?接著,把爬蟲(chóng)所需的庫(kù)都pip安裝一下并導(dǎo)入,所有庫(kù)的功能都有注釋。
import csv ?#用于把爬取的數(shù)據(jù)存儲(chǔ)為csv格式,可以excel直接打開(kāi)的
import time ?#用于對(duì)請(qǐng)求加延時(shí),爬取速度太快容易被反爬
from time import sleep #同上
import random ?#用于對(duì)延時(shí)設(shè)置隨機(jī)數(shù),盡量模擬人的行為
import requests ?#用于向網(wǎng)站發(fā)送請(qǐng)求
from lxml import etree ? ?#lxml為第三方網(wǎng)頁(yè)解析庫(kù),強(qiáng)大且速度快
構(gòu)造請(qǐng)求url,添加頭部信息headers即復(fù)制前文標(biāo)記的User-Agent,通過(guò)requests.get方法向服務(wù)器發(fā)送請(qǐng)求,返回html文本。添加headers目的在于告訴服務(wù)器,你是真實(shí)的人在訪問(wèn)其網(wǎng)站。如果你不添加headers直接訪服務(wù)器,會(huì)在對(duì)方服務(wù)器顯示python在訪問(wèn),那么,你很可能會(huì)被反爬,常見(jiàn)的反爬就是封你ip。
url = 'http://yz.yuzhuprice.com:8003/findPriceByName.jspx?page.curPage=1&priceName=%E7%BA%A2%E6%9C%A8%E7%B1%BB'
headers = {
'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36",
}
response = requests.get(url, headers=headers, timeout=10)
html = response.text
print(html)
我們運(yùn)行下以上代碼,看下效果:
?看到這個(gè),第一次接觸爬蟲(chóng)的朋友可能會(huì)有點(diǎn)懵。
其實(shí)這就是網(wǎng)頁(yè)源代碼,咱們右鍵打開(kāi)下源代碼看一哈。
?長(zhǎng)這樣:
?而我們需要提取的數(shù)據(jù),就潛藏在這網(wǎng)頁(yè)源代碼中,我們要用lxml庫(kù)中的etree方法解析下網(wǎng)頁(yè)。
parse = etree.HTML(html) ?#解析網(wǎng)頁(yè)
解析完之后,就可以開(kāi)開(kāi)心心的提取我們所需要的數(shù)據(jù)了。方法很多,比如xpath、select、beautiful soup,還有最難的re(正則表達(dá)式)。本文爬取的數(shù)據(jù)結(jié)構(gòu)較為簡(jiǎn)單,就直接用xpath玩一下吧。
?我們發(fā)現(xiàn),每一行數(shù)據(jù)對(duì)應(yīng)源碼里的一個(gè)id=173200的tr,那就先把這些tr都提取下來(lái)。
all_tr = parse.xpath('//*[@id="173200"]')
有些小伙伴不會(huì)寫(xiě)xpath。
那就找個(gè)簡(jiǎn)單辦法,直接copy所需的xpath。
所有tr都提取下來(lái)了,接下來(lái)就得依次從tr里面提取具體字段了。比如提取商品名稱(chēng)字段,點(diǎn)開(kāi)第一個(gè)tr,選中商品,copy其xpath。其他字段同理。
以下要注意幾點(diǎn),tr={key1 : value1, key2 : value2 }是python的字典數(shù)據(jù)類(lèi)型(你也可以根據(jù)自己興趣或需要存為列表或元組類(lèi)型)?!?join是指把獲取到的列表轉(zhuǎn)為字符串。./是指繼承前面的//*[@id=“173200”],strip()表示對(duì)提取的數(shù)據(jù)進(jìn)行簡(jiǎn)單的格式清洗。
for tr in all_tr:
? ? tr = {
? ? ? ? 'name': ''.join(tr.xpath('./td[1]/text()')).strip(),
? ? ? ? 'price': ''.join(tr.xpath('./td[2]/text()')).strip(),
? ? ? ? 'unit': ''.join(tr.xpath('./td[3]/text()')).strip(),
? ? ? ? 'supermaket': ''.join(tr.xpath('./td[4]/text()')).strip(),
? ? ? ? 'time': ''.join(tr.xpath('./td[5]/text()')).strip()
? ? }
咱們打印一下print(tr),看下效果。
此時(shí),你的心情也許是這樣的:
但還沒(méi)完,數(shù)據(jù)有了,咱們還得保存csv格式到本地,這一步比較簡(jiǎn)單,直接貼代碼。
with open('wood.csv', 'a', encoding='utf_8_sig', newline='') as fp:
? ? # 'a'為追加模式(添加)
? ? # utf_8_sig格式導(dǎo)出csv不亂碼
? ? fieldnames = ['name', 'price', 'unit', 'supermaket', 'time']
? ? writer = csv.DictWriter(fp, fieldnames)
? ? writer.writerow(tr)
打開(kāi)下剛生成的wood.csv,長(zhǎng)這樣:
二.爬取多頁(yè)
?別開(kāi)心的太早,你還僅僅是爬了一頁(yè)數(shù)據(jù),人家復(fù)制粘貼都比你快。咱們的志向可不在這,在詩(shī)和遠(yuǎn)方,哦不,是秒速爬海量數(shù)據(jù)。
那么,怎么才能爬取多頁(yè)數(shù)據(jù)呢?沒(méi)錯(cuò),for循環(huán)。
我們?cè)倩剡^(guò)頭來(lái)分析下url:
http://yz.yuzhuprice.com:8003/findPriceByName.jspx?page.curPage=1&priceName=%E7%BA%A2%E6%9C%A8%E7%B1%BB
我們把里面的page.curPage改成2試試,如下:
?你也許發(fā)現(xiàn)玄機(jī),只要改變page.curPage就可以實(shí)現(xiàn)翻頁(yè)。OK,那我們直接在url前面加個(gè)循環(huán)就好啦。format(x)是一種格式化字符串的函數(shù),可以接受不限個(gè)數(shù)的參數(shù)。
for x in range(1,3):
? ? url = 'http://yz.yuzhuprice.com:8003/findPriceByName.jspx?page.curPage={}&priceName=%E7%BA%A2%E6%9C%A8%E7%B1%BB'.format(x)
至此,你只要改變r(jià)ange想爬多少頁(yè)就爬多少頁(yè),開(kāi)不開(kāi)心?意不意外?
三.完善爬蟲(chóng)
如果僅僅按照以上代碼爬蟲(chóng),很有可能爬了十幾頁(yè)程序就崩了。我就多次遇到過(guò)中途報(bào)錯(cuò),導(dǎo)致爬蟲(chóng)失敗的情況。好不容易寫(xiě)出的爬蟲(chóng),怎么說(shuō)崩就崩呢。
報(bào)錯(cuò)原因就很多了,玩爬蟲(chóng)的都知道,調(diào)試bug是很麻煩的,需要不斷試錯(cuò)。這個(gè)爬蟲(chóng)的主要bug是TimeoutError。因此,我們需要進(jìn)一步完善代碼。
首先,要將以上代碼封裝成函數(shù),因?yàn)椴挥煤瘮?shù)有以下缺點(diǎn):
1、復(fù)雜度增大
2、組織結(jié)構(gòu)不夠清晰
3、可讀性差
4、代碼冗余
5、可擴(kuò)展性差
其次,在可能出現(xiàn)報(bào)錯(cuò)的地方都加上異常處理。即try…except。
?
題外話(huà)
在此疾速成長(zhǎng)的科技元年,編程就像是許多人通往無(wú)限可能世界的門(mén)票。而在編程語(yǔ)言的明星陣容中,Python就像是那位獨(dú)領(lǐng)風(fēng) 騷的超級(jí)巨星, 以其簡(jiǎn)潔易懂的語(yǔ)法和強(qiáng)大的功能,脫穎而出,成為全球最炙手可熱的編程語(yǔ)言之一。
Python 的迅速崛起對(duì)整個(gè)行業(yè)來(lái)說(shuō)都是極其有利的?,但“人紅是非多
”,導(dǎo)致它平添了許許多多的批評(píng),不過(guò)依舊擋不住它火爆的發(fā)展勢(shì)頭。
如果你對(duì)Python感興趣,想要學(xué)習(xí)pyhton,這里給大家分享一份Python全套學(xué)習(xí)資料,都是我自己學(xué)習(xí)時(shí)整理的,希望可以幫到你,一起加油!
??有需要的小伙伴,可以點(diǎn)擊下方鏈接免費(fèi)領(lǐng)取或者V掃描下方二維碼免費(fèi)領(lǐng)取??
??CSDN大禮包??:全網(wǎng)最全《Python學(xué)習(xí)資料》免費(fèi)分享(安全鏈接,放心點(diǎn)擊)??
?
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-787061.html
1??零基礎(chǔ)入門(mén)
① 學(xué)習(xí)路線
對(duì)于從來(lái)沒(méi)有接觸過(guò)Python的同學(xué),我們幫你準(zhǔn)備了詳細(xì)的學(xué)習(xí)成長(zhǎng)路線圖??梢哉f(shuō)是最科學(xué)最系統(tǒng)的學(xué)習(xí)路線,你可以按照上面的知識(shí)點(diǎn)去找對(duì)應(yīng)的學(xué)習(xí)資源,保證自己學(xué)得較為全面。
② 路線對(duì)應(yīng)學(xué)習(xí)視頻
還有很多適合0基礎(chǔ)入門(mén)的學(xué)習(xí)視頻,有了這些視頻,輕輕松松上手Python~
③練習(xí)題
每節(jié)視頻課后,都有對(duì)應(yīng)的練習(xí)題哦,可以檢驗(yàn)學(xué)習(xí)成果哈哈!
2??國(guó)內(nèi)外Python書(shū)籍、文檔
① 文檔和書(shū)籍資料
3??Python工具包+項(xiàng)目源碼合集
①Python工具包
學(xué)習(xí)Python常用的開(kāi)發(fā)軟件都在這里了!每個(gè)都有詳細(xì)的安裝教程,保證你可以安裝成功哦!
②Python實(shí)戰(zhàn)案例
光學(xué)理論是沒(méi)用的,要學(xué)會(huì)跟著一起敲代碼,動(dòng)手實(shí)操,才能將自己的所學(xué)運(yùn)用到實(shí)際當(dāng)中去,這時(shí)候可以搞點(diǎn)實(shí)戰(zhàn)案例來(lái)學(xué)習(xí)。100+實(shí)戰(zhàn)案例源碼等你來(lái)拿!
③Python小游戲源碼
如果覺(jué)得上面的實(shí)戰(zhàn)案例有點(diǎn)枯燥,可以試試自己用Python編寫(xiě)小游戲,讓你的學(xué)習(xí)過(guò)程中增添一點(diǎn)趣味!
4??Python面試題
我們學(xué)會(huì)了Python之后,有了技能就可以出去找工作啦!下面這些面試題是都來(lái)自阿里、騰訊、字節(jié)等一線互聯(lián)網(wǎng)大廠,并且有阿里大佬給出了權(quán)威的解答,刷完這一套面試資料相信大家都能找到滿(mǎn)意的工作。
5??Python兼職渠道
而且學(xué)會(huì)Python以后,還可以在各大兼職平臺(tái)接單賺錢(qián),各種兼職渠道+兼職注意事項(xiàng)+如何和客戶(hù)溝通,我都整理成文檔了。
上述所有資料 ?? ,朋友們?nèi)绻行枰模梢話(huà)呙柘路??????二維碼免費(fèi)領(lǐng)取??
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-787061.html
到了這里,關(guān)于爬蟲(chóng)實(shí)戰(zhàn)|手把手教你用Python爬蟲(chóng)(附詳細(xì)源碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!