Python3爬蟲(3)單網頁簡單爬取文字信息
在前兩篇小短文中,利用urllib.request和正則表達式實現了爬取圖片。
現在來爬取文字信息。
單網頁爬取文字 難度 1.0 星
在單個網頁中,利用BeautifulSoup4庫將文字快速抽取相對簡單,所以只有1.0難度。
希望你能在五個地鐵站的時間裡快速看完此短文。為降低難度,本文不用自定義函數。
這次不幸被選中的是58同城二手車頁面:
【成都二手車市場|成都二手車交易市場】 -成都58同城
前提:python3、BeautifulSoup4庫、pandas庫、Notepad++軟體
--這裡pandas庫用來處理數據,也許不是必須的,只是為了方便快捷, Notepad++是為了更高效的查看網頁代碼,也不是必須的。--
一:導入需要的庫
import urllib.requestnfrom bs4 import BeautifulSoupnimport pandas as pdn
BeautifulSoup4是python3中用於解析網頁的庫,pandas庫是用來整合、清洗、統計數據的。對pandas不熟悉的,可以逛逛我的另外一個專欄:
python3 pandas庫二、讀取、解碼網頁
url=http://cd.58.com/ershouche/nhtml=urllib.request.urlopen(url)nhtmltext=html.read().decode(utf-8)n
使用urlopen生成類文件類型,使用read()讀取其內容,再使用decode解碼成文本。
看到這一大片亂七八糟的代碼,頭都大了。我們需要將它格式化。
三、將網頁代碼格式化輸出
soup=BeautifulSoup(htmltext)nbeautitext=soup.prettify()nhandle=open(rE:testershouche.txt, w, encoding=utf-8)nhandle.write(beautitext)n
BeautifulSoup將網頁的文本內容解析成特殊的BeautifulSoup對象:
prettfy()就是將這種對象格式化,並轉換為string:
open函數在這裡是新建一個ershouche.txt的文件,並允許寫入,而且這個文件是utf-8的,與我們解析的網頁一致。
write就是將內容寫入文件。
如果使用notepad++軟體打開的話,這些網頁代碼就更加清晰明了。
四、解析html找到需要的內容
在經過n分鐘到n小時不等的人工解析後,我們發現:
原網頁的標題欄位於
標籤<h1 class="info_tit">下面。
信息欄位於標籤<div class="info_param">下面。
而價格欄位於標籤<div class="col col3">下面。
五、提取信息
在上一步的解析之後,就能利用find_all很快將信息提取出來。
title=[x.text.strip() for x in soup.find_all(h1,info_tit)]ninfo=[x.text.strip() for x in soup.find_all(div,info_param)]nprice=[x.text.strip() for x in soup.find_all(div,col col3)]n
這裡是三個一樣的語法結構,稍稍了解一下:
所以,最後title, info, price是三個分別包含了每輛車三部分信息的list。
我們要確保這三個list要一樣長,否則,信息就差遠了。
六、將信息組合:
將這三個list組合在一個有多種方法,個人比較喜歡用pandas。
df=pd.DataFrame()ndf[title]=titlendf[info]=infondf[price]=pricen
聰明的你也許發現有這兩步有多個重複的地方,可以用函數。不過本文為了降低難度還是不用的好。
DataFrame()在這裡建立了一個空的數據框。
然後使用直接賦值的方法將三個list變成了數據框的三列。
後續就是使用pandas對這些數據進行清洗,分列,匯總了。那些就是pandas的活了,這裡就略去了。
最後稍稍瞟一眼爬出來的數據:
下一篇文章,我們來把它這些二手車頁面全部爬一爬,看看有多少條信息,共有70個頁面啊。。。。。
#步驟一nimport urllib.requestnfrom bs4 import BeautifulSoupnimport pandas as pdn#步驟二nurl=http://cd.58.com/ershouche/nhtml=urllib.request.urlopen(url)nhtmltext=html.read().decode(utf-8)n#步驟三nsoup=BeautifulSoup(htmltext)nbeautitext=soup.prettify()nhandle=open(rE:testershouche.txt, w, encoding=utf-8)nhandle.write(beautitext)n#步驟五ntitle=[x.text.strip() for x in soup.find_all(h1,info_tit)]ninfo=[x.text.strip() for x in soup.find_all(div,info_param)]nprice=[x.text.strip() for x in soup.find_all(div,col col3)]n#步驟六ndf=pd.DataFrame()ndf[title]=titlendf[info]=infondf[price]=pricendf.to_excel(rE:testrawmaterial.xls)n
推薦閱讀:
※福布斯系列之數據採集 | Python數據分析項目實戰
※你猜簡書有多少名簽約作者?
※Python筆記 · 基於72萬知乎用戶信息的數據可視化