前言:
這篇文章是真正的干貨,我會盡力的把自己所要表達的東西表達出來。這次所完成的小程序缺點第一,不符合python面向對象的思想。第二,東西沒有做到函數化,而且挺多參數都是寫死的。本人也是做中學,下次再寫會盡力讓它完美一些。
目標:
本人最近新有了一個ipad mini,體會到了蘋果公司科技的力量,怪不得果粉這么多。(ipad用wps看pdf書籍真的好用,一般人我不告訴他。不過希望大家還是買正版書,紙質書真的比電子的強)。所以想獲得二手平板的信息,去吧就決定是你了:
58同城:http://bj.58.com/pbdn/0/pn1/
我們要爬取這個頁面的所有個人的信息
點進去
我們要:標題,價格,時間,地點,商家還是個人。
為了完成這個小工程,我們需要引入幾個第三方庫:lxml,requests,BeautifulSoup。這幾個庫的用法請自行查閱官方文檔,首先在最開始import所要用的庫
from bs4 import BeautifulSoup
import requests
然后通過觀察頁面網址的變化:
聰明的你一定發現了,商家和個人的區別就在于網址的一處變化,商家為http://bj.58.com/pbdn/1/個人為http://bj.58.com/pbdn/0/,所以寫一個簡單的函數:
def who_sell(who_sells=0):
??? list_view ='http://bj.58.com/pbdn/{}/pn1/'.format(str(who_sells))
??? return list_view
通過你改變函數參數,返回一個字符串,這里參數0就是個人1是商家,0為默認參數。接下來就是選出這個頁面中你想要的信息的連接:
main_url = who_sell(0)???????????????????????????????????????????????????? ?? (1)
web_data = requests.get(main_url)????????????????????????????????????? (2)
soup = BeautifulSoup(web_data.text,'lxml')?????????????? ?? ??????? (3)
select = soup.select('td.t a.t')????????????????????????????????????? ? ?????? (4)
leimu = who_sell(0)[:22]????????????????????????????????????????????? ? ????? (5)
print(leimu)???????????????????????????????????????????????????????????????????????? (6)
page_link = []????????????????????????????????????????????????????????????????????? (7)
for href in select:
? ? page_link.append(href.get('href'))? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? (8)
(1):我們先通過調用函數選中個人,返回一個網址,復制給main_url
(2):通過向這個選中的網址發送request請求,把得到的結果賦值給web_data
(3):對web_data的文本通過bs進行解析
(4):通過select函數選出你想要的東西,而‘td.t a.t’這個的來源先請看圖:
在你想要看的元素上面右鍵,檢查:
學過網頁的小伙伴很快就能明白,這其中的奧秘,如果一臉霧水的小伙伴就可以看一下HTML5以及css的知識,這里個人推一下w3school 。看完這個,這里的東西就會很輕松讀懂。觀察之后你會發現,我們所需要的東西在一個<td class="t"><a href="所要去的網址" class="t"></a></td>之中,我們要把href提取出來,所以我們select之中的差數即為‘td.t a.t’。這里的點可以理解為td的標簽下 class=‘t’。通過這個唯一標識,我們就能get到想要的東西
(5):返回類目,也就是我們爬取的根網頁,這個并不是我們想要的東西,只是方便將來我看爬取的東西是什么。用了切片切取了網頁的前22位。(6):打印出來類目
(7):創建一個list,用來存放網址
(8):把獲取的網址添加到list中去
現在我們已經有了具體的網址,接下來我們要爬取具體信息了:
for url inpage_link:??? inf = requests.get(url)
??? inf_soup = BeautifulSoup(inf.text,'lxml')
??? titles = inf_soup.select('div.col_sub.mainTitle > h1')
??? times = inf_soup.select('li.time')
??? prices = inf_soup.select('div.su_con > span.price')
??? places = inf_soup.select('div.su_con > span.c_25d')
??? if titles==[]:
??????? title=['null']
??? else:
?? ? ?? title=titles[0].get_text()
??? if times == []:
??????? time = ['空']
??? else:
??????? time = times[0].text
??? if prices == []:
??????? price = ['null']
??? else:
??????? price= prices[0].text
??? if places == []:
??????? place = ['null']
??? else:
??????? place = places[0].text[1:3]+places[0].text[-3:-1]
??? data = {
??? 'title': title,
??? 'time': time,
??? 'price': price,
??? 'places': place,
??? '類型':'個人'if(main_url[22:23] =='0')else'商家'
?}
??? if(title!=['null']):
?? ? ?? print(data)
for循環的意思即為,遍歷list中所有的網址。
inf = requests.get(url)
inf_soup = BeautifulSoup(inf.text,'lxml')
titles = inf_soup.select('div.col_sub.mainTitle > h1')
times = inf_soup.select('li.time')
prices = inf_soup.select('div.su_con > span.price')
places = inf_soup.select('div.su_con > span.c_25d')
同get到href的方法,右鍵檢查
以價格為例,在class='su_con'的子標簽中他的clss='price c_f50',我們根據這個就可以提取出來所想要的信息。
if titles==[]:
title=['null']
else:
title=titles[0].get_text()
if times == []:
time = ['空']
else:
time = times[0].text
if prices == []:
price = ['null']
else:
price= prices[0].text
if places == []:
place = ['null']
else:
place = places[0].text[1:3]+places[0].text[-3:-1]
在這些if語句中,如果賣家沒填這些信息,我們把他設為空,如果填了我們就用.text方法把兩個標簽之間夾的信息提取出來,例如price里的3000。這里的地址使用了切片因為提取出來的信息含有大量的換行符。所以切取想要的部分,并用加號連接。
data = {
'title': title,
'time': time,
'price': price,
'places': place,
'類型':'個人'if(main_url[22:23] =='0')else'商家'
}
if(title!=['null']):
??? print(data)
把提取的信息存放到一個叫data的字典里。這里有一個問題,直接輸出字典會出現全空的網頁,所以這里通過過濾title的方法來過濾掉沒用的信息。我們可以看一下結果:
最后:
就是這樣~是不是感覺還可以。這只是一個簡單的版本,有興趣的小伙伴可以把整個北京的信息都爬取下來,可以做一些簡單的數據處理。只需要在加一個循環即可。
可以加博主qq:844255371 咱們共同研究,記得附上備注簡書。
博主臉皮中等厚度,記得文明探討最后的最后,附上github,ipad.py就是源代碼。github?