本周最后一節(jié)課了猾愿,這大作業(yè)比較綜合,要在頁面上提取網(wǎng)址账阻,然后根據(jù)提取到的網(wǎng)址蒂秘,進行解析,提取每個網(wǎng)址上面的有效信息淘太,例如標題姻僧、時間规丽、地址、價格撇贺、瀏覽量等赌莺。
難點主要有:
- 要提取個人用戶發(fā)布的信息,而非商家的松嘶。
- 瀏覽量由js控制雄嚣,要找到js的網(wǎng)址才行。
- 有些頁面沒有地址信息喘蟆,這會導致程序運行中斷缓升。
我的成果
我的代碼
from bs4 import BeautifulSoup
import requests,time
def get_links_from(who_sells=0):
urls = []
list_view = 'http://bj.58.com/pbdn/{}/pn2/'.format(str(who_sells))
wb_data = requests.get(list_view)
soup=BeautifulSoup(wb_data.text,'lxml')
for link in soup.select('td.t a.t'):
urls.append(link.get('href').split('?')[0])
return urls
#print(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)
views = js.text.split('=')[-1]
return views
def get_item_info(who_sells=0):
urls = get_links_from(who_sells)
for url in urls:
wb_data = requests.get(url)
soup = BeautifulSoup(wb_data.text,'lxml')
data = {
"title":soup.title.text,
"price": soup.select('div.price_li > span > i')[0].text,
'area': list(soup.select('div.palce_li > span > i')[0].stripped_strings),
"cata": '個人' if who_sells == 0 else '商家',
'views': soup.select('span.look_time')[0].text
}
print(data)
#get_links_from()
get_item_info()
我的總結(jié)
-
關(guān)于提取個人賣家信息,需要觀察網(wǎng)站蕴轨,以及尋找合適的標簽港谊。
點擊上圖的入口,然后觀察網(wǎng)址的變化橙弱,可以看到“1”是代表商家歧寺,“0”是代表個人賣家。
list_view = 'http://bj.58.com/pbdn/{}/pn2/'.format(str(who_sells))
-
由js控制的瀏覽量應該怎么弄呢棘脐?(因為后來網(wǎng)站更新斜筐,瀏覽量不再由js控制了,所以提取更簡單了)蛀缝。
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) views = js.text.split('=')[-1] return views
必須找到js控制的網(wǎng)址顷链,然后比對和原來網(wǎng)址的聯(lián)系,根據(jù)這種比對屈梁,就能實現(xiàn)從原網(wǎng)址到js網(wǎng)址的轉(zhuǎn)換嗤练。當然有兩個函數(shù)必不可少,分別是split和strip在讶,split表示從某個標識分割網(wǎng)址煞抬,而strip則表示去掉某個部分。通過這種剪切构哺,就能轉(zhuǎn)到js網(wǎng)址了革答。
-
如果想要網(wǎng)址的標題,可以直接使用網(wǎng)址中head部分曙强。
"title":soup.title.text
這就表示直接提取head中的標題残拐。
-
可以直接尋找class部分,來指定地址旗扑。
'views': soup.select('span.look_time')[0].text
例如上面的語句蹦骑,直接在審查部分搜索span.look_time,發(fā)現(xiàn)這個部分是唯一的臀防,即可定位眠菇。隔了幾行的class樣式之間边败,不用 > 符號,直接空格表示即可捎废。
另外笑窜,class樣式中出現(xiàn)的 # 號,表示 id 的意思登疗。想幾個段落一起縮進的話排截,可以選擇語句后,直接按 Tab鍵辐益。
樣式標簽前方的 . 代表的是class的意思断傲。 -
最后,在語句中也可以實現(xiàn)條件選擇智政。
"cata": '個人' if who_sells == 0 else '商家'
用簡單的 if ...... else ..... 語句即可實現(xiàn)认罩。
當網(wǎng)頁運行時,由于某個網(wǎng)頁沒有某些元素而導致錯誤時怎么辦续捂?
用 if ...... else None 垦垂。如果在網(wǎng)頁里面不能find_all這些元素的話,就直接會顯示為None.