??? 經朋友介紹斤蔓,認識到了python實戰(zhàn):四周實習爬蟲系統(tǒng),然后看了一下試看教程阻桅,覺得課程挺不錯的,→_→重點是對于學生黨有點貴啊彭则,經過幾天糾結還是決定加入這個課程了鳍刷。
??? 現(xiàn)在就不多說廢話了,直接寫心得俯抖,首先按照課程要求安裝lxml输瓜,Beautiful Soup ,Requests芬萍,對了尤揣,忘記說我的環(huán)境,WIN7 64位,python3.4版本柬祠,其實有心換MAC北戏,奈何非我們這種普通人買的起的,所以就WIN環(huán)境先用著漫蛔,因為我提前裝了PIP嗜愈,安裝這些都挺容易的旧蛾,直接pip3 install xxxx就行了,反正我中間沒有遇到錯誤蠕嫁。
??? 什么環(huán)境也準備好了锨天,然后開基礎課程,什么認識網頁結構之類的就不多說了剃毒,反正我也只是了解一下這個病袄,說具體的也不是太懂。然后主要是定位網頁元素了赘阀,我們重點是要學習這個益缠,用google chrome瀏覽器中的檢查,就可以查詢到結構基公。當然剛開始都是比較簡單的幅慌,我覺得是比較好學的。
??? 剩下的就是import各種庫轰豆,然后使用代碼了:
剛開始用BeautifulSoup還是認真的打一下代碼吧欠痴,soup = BeautifulSoup(html,'lxml')
這是soup html都是變量? lxml是解析網頁用的五個庫中的一個
??? 課程中所講的節(jié)點什么的似乎沒什么難的,兄弟節(jié)點和父子節(jié)點應該都是可以看得懂的秒咨,只要學過高中生物遺傳部分的應該都不難看懂。
??? 剩下的就是自己實際操作了掌挚,課程自帶的網頁就是很好的練手工具了雨席,初步練手之后就是實戰(zhàn)58同城了。
?? 先爬一個界面下的詳細信息吠式,源代碼如下
url = 'http://bj.58.com/pingbandiannao/25853969546167x.shtml'
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text,'lxml')
??? url這個不用說了陡厘,是你要訪問的地址,然后用requests獲取內容儲存到變量wb_data中特占,然后使用BeauifulSoup解析到soup變量中糙置,然后我們來提取一下想要的內容,
title = soup.title.text
price = soup.select('#content span.price')
data = soup.select('.time')
area = soup.select('.c_25d')
??? 這里就是提取想要的內容是目,因為標題是直接顯示在網頁頭的谤饭,所以使用了取巧方法titile.text,價格懊纳、更新時間揉抵、還有區(qū)域是使用的查看結構的方式去獲取的,最后把他們封裝在字典中嗤疯,
data = {
'標題':title,
'價格':price[0].text,
'時間':data[0].text,
'所屬區(qū)域':list(area[0].stripped_strings) if soup.find_all('span','c_25d') else None,
'類型':'個人'if who_selit==0 else'商家',
'瀏覽次數(shù)':get_view_from(url)
}
??? 因為區(qū)域部分有些網頁中是沒有的冤今,所以使用了if作為條件判斷,如果沒有就返回控制None茂缚,幼兒畫就打印戏罢,至于類型部分有個if判斷是后期判斷抓取的數(shù)據(jù)是個人還是商家的列表所使用屋谭,這里沒什么關系。這段代碼寫完以后就是print打印一下內容了龟糕。
??? 抓取單網頁的內容就結束了桐磁,下面說一下返回到列表頁面去抓當前列表的所有內容。
urls=[]
list_view = 'http://bj.58.com/pbdn/{}/pn2/'.format(str(who_selit))
wb_data = requests.get(list_view)
soup = BeautifulSoup(wb_data.text,'lxml')
for link in soup.select('td.t > a.t'):
if str('jump') in str(link) or str('zhuanzhuan')in str(link):
pass
else:
urls.append(link.get('href').split('?')[0])
return urls
先說下代碼的步驟翩蘸,定義下urls變量為一個列表所意,然后定義一下list_view的內容,這里就是58額列表頁面催首,最后的方法.format(str(who_selit)),是替換一下內容扶踊,這個是比較簡單,who_selit變量就是要替換進去的內容郎任,然后就是解析網頁什么的秧耗,通過select查找網頁結構獲取想要的網址,寫個循環(huán)進去獲取每個商品的網址舶治,因為58里面有個轉轉界面分井,所以寫個if判斷下獲取的網址,如果是轉轉的就pass了霉猛,不是的話加入到urls這個變量中尺锚。
??? 由于瀏覽次數(shù)這個是JS控制的,并且和商品的URL是有一定關系的惜浅,這里我貼一下代碼瘫辩,這段代碼我只能看懂,如果讓我說個123還真說不出來坛悉。
id = url.split('/')[-1].strip('x.shtml')
api = 'http://jst1.58.com/counter?infoid={}'.format(id)
js = requests.get(api)
views = js.text.split('=')[-1]
到這里似乎就差不多了 封裝一下各個部分伐厌,然后做個完整的程序出來,下面貼一下完整的代碼
#-*-coding:utf-8-*-
from bs4 import BeautifulSoup
import requests
import time
def get_urls(who_selit=0):
urls=[]
list_view = 'http://bj.58.com/pbdn/{}/pn2/'.format(str(who_selit))
wb_data = requests.get(list_view)
soup = BeautifulSoup(wb_data.text,'lxml')
for link in soup.select('td.t > a.t'):
#剔除轉轉界面
if str('jump') in str(link) or str('zhuanzhuan')in str(link):
pass
else:
urls.append(link.get('href').split('?')[0])
return urls
#返回所有的商品界面
def get_view_from(url):
id = url.split('/')[-1].strip('x.shtml')
api = 'http://jst1.58.com/counter?infoid={}'.format(id)
js = requests.get(api)
#獲取一下瀏覽次數(shù)
views = js.text.split('=')[-1]
return views
def get_info(who_selit=0):
urls = get_urls(who_selit)
for url in urls:
wb_date = requests.get(url)
soup = BeautifulSoup(wb_date.text,'lxml')
title = soup.title.text
price = soup.select('#content span.price')
data = soup.select('.time')
area = soup.select('.c_25d')
data = {
'標題':title,
'價格':price[0].text,
'時間':data[0].text,
'所屬區(qū)域':list(area[0].stripped_strings) if soup.find_all('span','c_25d') else None,
'類型':'個人'if who_selit==0 else'商家',
'瀏覽次數(shù)':get_view_from(url)
}
time.sleep(0.5)
#延遲一下 避免58的反爬蟲
print(data)
#解析每個商品界面并且整理到字典中并且輸出
get_info()
以上代碼經過2016.05.06測試可以使用并且正確輸出