工作這么多年一直想學(xué)習(xí)一下爬蟲(chóng)技術(shù)放接,各種嘗試之后發(fā)現(xiàn)學(xué)習(xí)的最好方式就是直接開(kāi)干:那就找一個(gè)想爬的東西開(kāi)始爬笆畲唷声怔!
從模仿用正則表達(dá)式爬取逛犹,到現(xiàn)在通過(guò)網(wǎng)絡(luò)課程學(xué)習(xí)使用BeatifulSoup庫(kù)來(lái)爬取信息闽撤,大概花了一個(gè)月左右的零散時(shí)間得哆,感覺(jué)還是有些進(jìn)步的,得記錄一下哟旗,現(xiàn)在就分享一下58同城二手物品信息的爬取過(guò)程贩据。
1.分析爬取目標(biāo)頁(yè)面與目標(biāo)
以58同城二手物品頁(yè)面開(kāi)始,爬取該頁(yè)面中二手物品詳細(xì)信息闸餐。
詳細(xì)信息分布在子頁(yè)面中饱亮,故,需要先從主頁(yè)面獲取子頁(yè)面的鏈接舍沙,再?gòu)淖禹?yè)面中獲取我們的目標(biāo)信息近上。這樣把爬取過(guò)程分成了兩部分:
- 爬主頁(yè)面獲取二手物品子頁(yè)面的信息;
-爬取子頁(yè)面(頁(yè)面示例)獲取對(duì)應(yīng)二手物品的標(biāo)題场勤、價(jià)格戈锻、成色、區(qū)域和媳、發(fā)布日期格遭、類(lèi)別等信息。
對(duì)應(yīng)的留瞳,我們查看對(duì)應(yīng)的頁(yè)面拒迅,**確定所需要爬取的元素在對(duì)應(yīng)頁(yè)面中所處的位置、確定獲取方式她倘。
2. 爬取主頁(yè)面中的二手物品鏈接
通過(guò)chrome檢查主頁(yè)面璧微,在對(duì)應(yīng)二手物品標(biāo)題位置右鍵、檢查硬梁,查看鏈接對(duì)應(yīng)的網(wǎng)頁(yè)元素位置前硫,復(fù)制對(duì)應(yīng)的位置表述,如下:
復(fù)制結(jié)果即是對(duì)應(yīng)的鏈接位置表述:
infolist > table:nth-child(7) > tbody > tr:nth-child(2) > td.t > a
由于網(wǎng)頁(yè)構(gòu)成中td標(biāo)簽荧止、t樣式下的a標(biāo)簽對(duì)應(yīng)的內(nèi)容都是子頁(yè)面鏈接屹电,故可以用‘td.t > a’作為篩選條件,通過(guò)BeautifulSoup中的select方法對(duì)其進(jìn)行篩選跃巡。代碼見(jiàn)最后部分危号。(注:代碼中對(duì)業(yè)面中的一些特殊物品類(lèi)別進(jìn)行了剔除,包括轉(zhuǎn)轉(zhuǎn)頁(yè)面素邪、推薦信息部分等)
3. 爬取子頁(yè)面中物品詳細(xì)信息
將上一步獲取的子頁(yè)面鏈接傳遞給
過(guò)程與提取主頁(yè)面中鏈接是一樣的外莲,不過(guò)這次需要提取的元素多了一些,我們按上述過(guò)程逐個(gè)檢查兔朦,確定元素對(duì)應(yīng)的篩選表述偷线。
最后通過(guò)get_text等方式磨确,將所需信息從爬取的元素中提取出來(lái)。
4.完整的python代碼
from bs4 import BeautifulSoup
import time
import requests
url_58 = 'http://bj.58.com/pbdn/0/'
def get_url_list(url):
web_data = requests.get(url)
soup = BeautifulSoup(web_data.text,'lxml')
url = soup.select('td.t > a[class="t"]')
url_list = ''
for link in url:
link_i = link.get('href')
if 'zhuanzhuan'in link_i:
pass
else:
if 'jump' in link_i:
pass
else:
url_list = url_list + '\n'+link_i
print('urllist',url_list)
return url_list
def get_info():
url_list = get_url_list(url_58)
for url in url_list.split():
time.sleep(1)
web_data = requests.get(url)
soup = BeautifulSoup(web_data.text,'lxml')
type = soup.select('#header > div.breadCrumb.f12 > span:nth-of-type(3) > a')
title = soup.select('div.col_sub.mainTitle > h1')
date = soup.select('li.time')
price = soup.select('div.person_add_top.no_ident_top > div.per_ad_left > div.col_sub.sumary > ul > li:nth-of-type(1) > div.su_con > span.price.c_f50')
fineness = soup.select('div.col_sub.sumary > ul > li:nth-of-type(2) > div.su_con > span')
area = soup.select('div.col_sub.sumary > ul > li:nth-of-type(3) > div.su_con > span')
#print(type,title,date,price,fineness,area)
for typei,titlei,datei,pricei,finenessi,areai in zip(type,title,date,price,fineness,area):
data = {
'type':typei.get_text(),
'title':titlei.get_text(),
'date':datei.get_text(),
'price':pricei.get_text(),
'fineness':(finenessi.get_text()).strip(),
'area':list(areai.stripped_strings)
}
print(data)
get_info()
5.最終結(jié)果樣例
{'area': ['通州', '-', '物資學(xué)院路'], 'title': 'iPad mini 2 Wi-Fi 16G 白色 港版', 'date': '2016-05-07', 'type': '北京二手平板電腦', 'fineness': '-', 'price': '1200'}
{'area': ['西城', '-', '西單'], 'title': 'iPad2 16G 國(guó)行 WiFi 平板電腦', 'date': '2016-05-07', 'type': '北京二手平板電腦', 'fineness': '-', 'price': '900'}
6.總結(jié)
其實(shí)從網(wǎng)頁(yè)中提取對(duì)應(yīng)元素并不復(fù)雜淋昭,麻煩的是反爬俐填、對(duì)目標(biāo)信息進(jìn)行提取(get_text安接、stripped_strings等等方法還需要繼續(xù)研究一下)翔忽,以及對(duì)整個(gè)爬取過(guò)程的控制:通常我們要獲取的信息都不止在一個(gè)頁(yè)面上,這就需要一個(gè)好的過(guò)程調(diào)度盏檐,保證爬取效率歇式。
以上僅供學(xué)習(xí),請(qǐng)勿用于商業(yè)用途胡野。