一、作業(yè)描述
爬取如上本地網(wǎng)頁上商品的圖片地址油坝、標(biāo)題焕窝、價(jià)格蹬挺、瀏覽量和評(píng)分星級(jí)。
二它掂、作業(yè)目的
- 使用with函數(shù)讀取本地網(wǎng)頁
- 使用bs4解析本地網(wǎng)頁
- 使用css selector定位網(wǎng)頁內(nèi)容
- 使用.select方法爬取所需內(nèi)容
- 使用字典格式化爬取數(shù)據(jù)
三巴帮、作業(yè)代碼
from bs4 import BeautifulSoup
#使用with函數(shù)會(huì)在文件命令執(zhí)行完畢后自動(dòng)關(guān)閉文件
with open('/home/xss/Plan-for-combating/week1/1_2/1_2answer_of_homework/index.html','r') as wb_data:
soup = BeautifulSoup(wb_data, 'lxml')
images = soup.select('div.thumbnail > img')
prices = soup.select('div.caption > h4.pull-right')
titles = soup.select('div.caption > h4 > a')
amouts = soup.select('p.pull-right')
ratings = soup.select('div.ratings > p:nth-of-type(2)')
info = []
for title, image, price, amout, rating in zip(titles, images, prices, amouts, ratings):
data = {
'title' : title.get_text(),
'image' : image.get('src'),
'price' : price.get_text(),
'amout' : amout.get_text(),
'rating' : len(rating.find_all('span', class_ = 'glyphicon glyphicon-star'))
}
info.append(data)
for i in info:
if float(i['rating']) > 3:
print(i['title'], i['price'])
作業(yè)小結(jié):
- css selector不必使用完整的,只要能唯一確定所要爬取的內(nèi)容即可虐秋。
- zip函數(shù)的用法
定義:zip([iterable, ...])
zip()是Python的一個(gè)內(nèi)建函數(shù)榕茧,它接受一系列可迭代的對(duì)象作為參數(shù),將對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)個(gè)tuple(元組)熟妓,然后返回由這些 tuples組成的list(列表)雪猪。若傳入?yún)?shù)的長度不等,則返回list的長度和參數(shù)中長度最短的對(duì)象相同起愈。利用*號(hào)操作符只恨,可以將list unzip(解壓)。
例如
>>>> a = [1,2,3]
>>>> b = [4,5,6]
>>>> zipped = zip(a,b)
[(1, 4), (2, 5), (3, 6)]
- find_all方法可以將符合條件的標(biāo)簽打包為一個(gè)列表抬虽,獲得評(píng)分就是通過將所有屬性為'glyphicon glyphicon-star'的span標(biāo)簽打包成一個(gè)列表官觅,并用len函數(shù)返回其長度從而獲取星級(jí)數(shù)。
- get_text()方法用于獲取文本內(nèi)容阐污,get()方法用于獲得指定屬性內(nèi)的內(nèi)容休涤,返回值均為字符串。