這個(gè)作業(yè)主要就是跟著視頻教學(xué)《Python開發(fā)簡(jiǎn)單爬蟲》霎俩,學(xué)著自己寫了一個(gè)簡(jiǎn)單的爬百度百科的爬蟲上陕。
一開始的代碼都是跟著視頻里寫的桂对,自己編譯運(yùn)行的時(shí)候就出了一堆錯(cuò)脆栋。
首先是打錯(cuò)字倦卖,比如utf寫成uft,init寫成int椿争,改完后編譯通過怕膛,但是爬蟲只爬了輸入的第一個(gè)網(wǎng)頁就報(bào)craw failed,不再繼續(xù)爬了秦踪;
繼續(xù)檢查發(fā)現(xiàn)是有些模塊的函數(shù)的return語句被我再查錯(cuò)的時(shí)候不小心注釋掉了褐捻,改后仍然只能爬取第一個(gè)網(wǎng)頁;
打印獲得的第二個(gè)網(wǎng)頁椅邓,復(fù)制網(wǎng)頁地址到crome里打開柠逞,發(fā)現(xiàn)顯示的是“鎖定詞條”,該頁面沒有其他可以連接的url景馁,于是爬蟲只能停止工作板壮。為什么我爬蟲獲取的第二個(gè)url是這個(gè)呢?我打開第一個(gè)url也就是百度百科python詞條的頁面裁僧,右鍵審查元素个束,查到了第二個(gè)url的html語句如下:
<a class="lock-lemma" target="_blank" href="/view/10812319.htm" title="鎖定">
而老師視頻里我抄下來的抓取url的正則表達(dá)式正好是:
links = soup.find_all('a', href=re.compile(r"/item/\d*+.html"))
可以看到,上面的語句是滿足下面的正則表達(dá)式的聊疲,所以python把這個(gè)url加入到url管理器中茬底,作為下一條代爬取的url,導(dǎo)致程序的終止获洲。那么證明由于百度又更新了編碼阱表,所以之前的正則表達(dá)式不適用于現(xiàn)在的頁面了。重新分析頁面贡珊,右鍵審查原色最爬,得到可鏈接的其它頁面的語句如下:
<a target="_blank" href="/item/Guido%20van%20Rossum">Guido van Rossum</a>
可以發(fā)現(xiàn),這些語句都是標(biāo)題為a门岔,href格式為/item開頭加上后面一系列字符串組成爱致,所以我講正則表達(dá)式改為:
links = soup.find_all('a', href=re.compile(r"/item/\w*"))
重新運(yùn)行,python爬取1000個(gè)頁面寒随,成功打印出頁面url糠悯、標(biāo)題、內(nèi)容妻往。
不過很快我發(fā)現(xiàn)新的問題互艾,輸出的標(biāo)題和內(nèi)容,凡是有中文的都是亂碼讯泣,而我按照老師的教學(xué)纫普,在輸入標(biāo)題時(shí)進(jìn)行了轉(zhuǎn)碼,代碼如下:
fout.write("<td>%s</td>" % data['title'].encode('utf-8'))
但是仍然輸出的是亂碼好渠,我在網(wǎng)上搜了很多辦法昨稼,到現(xiàn)在依然沒有解決,希望有搞定這個(gè)問題的兄弟姐妹們告訴我是這么回事呢拳锚?悦昵?(我把打印輸出的代碼貼出來給大家看看,環(huán)境是python2.7 OSX系統(tǒng))
# coding=utf-8
class HtmlOutputer(object):
def __init__(self):
self.datas=[]
def collect_data(self,data):
if data is None:
return
self.datas.append(data)
def output_html(self):
fout = open('output.html','w')
fout.write("<html>")
fout.write("<body>")
fout.write("<table>")
for data in self.datas:
fout.write("<tr>")
fout.write("<td>%s</td>" % data['url'])
fout.write("<td>%s</td>" % data['title'].encode('utf-8'))
fout.write("<td>%s</td>" % data['summary'].encode('utf-8'))
fout.write("</tr>")
fout.write("</table>")
fout.write("</body>")
fout.write("</html>")
剛剛折騰了一個(gè)中午晌畅,大概發(fā)現(xiàn)了問題所在但指,應(yīng)該是瀏覽器編碼問題。一開始我試著直接打印輸出data['title'].抗楔,發(fā)現(xiàn)即使是中文也不會(huì)亂碼棋凳,于是我將output。html改為用pycharm打開连躏,發(fā)現(xiàn)里面的中文都能正常顯示剩岳。最后,我講output_html函數(shù)改寫為output_txt函數(shù)入热,將要打印的內(nèi)容改寫到txt文件拍棕,寫完打開發(fā)現(xiàn)晓铆,中文都能正常顯示了。我猜绰播,瀏覽器的編碼可能不是UTF8骄噪,所以它反而將中文識(shí)別稱為亂碼了。
總之蠢箩,終于把所有bug解決完畢了链蕊,噓一口氣啦~~
--------------我是不依不饒的分割線------------
仔細(xì)想了下,剛剛還不算是完全解決亂碼問題谬泌,因?yàn)槲覍懙絟tml文件里面還是亂碼滔韵。用crome隨便打開一個(gè)網(wǎng)頁,右鍵查看源碼掌实,發(fā)現(xiàn)如下顯示陪蜻;
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
里面的 <meta charset="utf-8">,就是 html 編碼的約束 贱鼻。
所以在 html_outputer.py 中囱皿,write之前加入一句話:
fout.write("<meta charset='utf-8'>")
再運(yùn)行,用crome打開output.html忱嘹,就會(huì)發(fā)現(xiàn)整整齊齊的中文啦嘱腥。
這回真正的完結(jié)撒花,折騰了一整天了可以噓一口氣了拘悦。