Python實戰(zhàn)課程第一周筆記

??? 經(jīng)朋友介紹,認(rèn)識到了python實戰(zhàn):四周實習(xí)爬蟲系統(tǒng),然后看了一下試看教程,覺得課程挺不錯的,→_→重點是對于學(xué)生黨有點貴啊,經(jīng)過幾天糾結(jié)還是決定加入這個課程了。

??? 現(xiàn)在就不多說廢話了,直接寫心得,首先按照課程要求安裝lxml,Beautiful Soup ,Requests,對了,忘記說我的環(huán)境,WIN7 64位,python3.4版本,其實有心換MAC,奈何非我們這種普通人買的起的,所以就WIN環(huán)境先用著,因為我提前裝了PIP,安裝這些都挺容易的,直接pip3 install xxxx就行了,反正我中間沒有遇到錯誤。

??? 什么環(huán)境也準(zhǔn)備好了,然后開基礎(chǔ)課程,什么認(rèn)識網(wǎng)頁結(jié)構(gòu)之類的就不多說了,反正我也只是了解一下這個,說具體的也不是太懂。然后主要是定位網(wǎng)頁元素了,我們重點是要學(xué)習(xí)這個,用google chrome瀏覽器中的檢查,就可以查詢到結(jié)構(gòu)。當(dāng)然剛開始都是比較簡單的,我覺得是比較好學(xué)的。

??? 剩下的就是import各種庫,然后使用代碼了:

剛開始用BeautifulSoup還是認(rèn)真的打一下代碼吧,soup = BeautifulSoup(html,'lxml')

這是soup html都是變量? lxml是解析網(wǎng)頁用的五個庫中的一個

??? 課程中所講的節(jié)點什么的似乎沒什么難的,兄弟節(jié)點和父子節(jié)點應(yīng)該都是可以看得懂的,只要學(xué)過高中生物遺傳部分的應(yīng)該都不難看懂。

??? 剩下的就是自己實際操作了,課程自帶的網(wǎng)頁就是很好的練手工具了,初步練手之后就是實戰(zhàn)58同城了。

?? 先爬一個界面下的詳細(xì)信息,源代碼如下

url = 'http://bj.58.com/pingbandiannao/25853969546167x.shtml'
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text,'lxml')

??? url這個不用說了,是你要訪問的地址,然后用requests獲取內(nèi)容儲存到變量wb_data中,然后使用BeauifulSoup解析到soup變量中,然后我們來提取一下想要的內(nèi)容,

title = soup.title.text
price = soup.select('#content span.price')
data = soup.select('.time')
area = soup.select('.c_25d')


??? 這里就是提取想要的內(nèi)容,因為標(biāo)題是直接顯示在網(wǎng)頁頭的,所以使用了取巧方法titile.text,價格、更新時間、還有區(qū)域是使用的查看結(jié)構(gòu)的方式去獲取的,最后把他們封裝在字典中,

data = {
'標(biāo)題':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ū)域部分有些網(wǎng)頁中是沒有的,所以使用了if作為條件判斷,如果沒有就返回控制None,幼兒畫就打印,至于類型部分有個if判斷是后期判斷抓取的數(shù)據(jù)是個人還是商家的列表所使用,這里沒什么關(guān)系。這段代碼寫完以后就是print打印一下內(nèi)容了。

??? 抓取單網(wǎng)頁的內(nèi)容就結(jié)束了,下面說一下返回到列表頁面去抓當(dāng)前列表的所有內(nèi)容。

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的內(nèi)容,這里就是58額列表頁面,最后的方法.format(str(who_selit)),是替換一下內(nèi)容,這個是比較簡單,who_selit變量就是要替換進(jìn)去的內(nèi)容,然后就是解析網(wǎng)頁什么的,通過select查找網(wǎng)頁結(jié)構(gòu)獲取想要的網(wǎng)址,寫個循環(huán)進(jìn)去獲取每個商品的網(wǎng)址,因為58里面有個轉(zhuǎn)轉(zhuǎn)界面,所以寫個if判斷下獲取的網(wǎng)址,如果是轉(zhuǎn)轉(zhuǎn)的就pass了,不是的話加入到urls這個變量中。

??? 由于瀏覽次數(shù)這個是JS控制的,并且和商品的URL是有一定關(guān)系的,這里我貼一下代碼,這段代碼我只能看懂,如果讓我說個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'):
#剔除轉(zhuǎn)轉(zhuǎn)界面
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 = {
'標(biāo)題':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()


以上代碼經(jīng)過2016.05.06測試可以使用并且正確輸出

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容