學習Python第二節課,爬取商品信息。
1.爬取目標
爬取本地網頁中圖片地址、價格、商品標題、瀏覽量、評分星級。
爬取網頁及爬取信息
2.爬取成果
本地網頁爬取信息成果
3.我的代碼
#! /usr/bin/env/python
# -*- coding:utf-8 -*-
from bs4 import BeautifulSoup
path='./1_2_homework_required/index.html' #這里使用了相對路徑,只要本地有這個文件就能打開
with open(path,'r') as f: # 使用with open打開本地文件
Soup = BeautifulSoup(f,'lxml') # 解析網頁內容
# print(Soup) 打印網頁被解析后得到的內容(網頁代碼)
titles = Soup.select('body > div > div > div.col-md-9 > div > div > div > div.caption > h4 > a') # 復制每個元素的css selector 路徑
images = Soup.select('body > div > div > div.col-md-9 > div > div > div > img')
prices = Soup.select('body > div > div > div.col-md-9 > div > div > div > div.caption > h4.pull-right')
stars = Soup.select('body > div > div > div.col-md-9 > div > div > div > div.ratings > p:nth-of-type(2)')
reviews = Soup.select('body > div > div > div.col-md-9 > div > div > div > div.ratings > p.pull-right')
# print(titles,images,prices,stars,reviews,sep='\n----------------------------\n') # 打印每個元素,其中sep='\n--------\n'是為了在不同元素之間添加分割線
for title,image,price,star,review,in zip(titles,images,prices,stars,reviews): # 使用for循環,把每個元素裝到字典中
data = {
'title':title.get_text(),
'image':image.get('src'),
'price':price.get_text(),
'review':review.get_text(),
'star': len(star.find_all("span", class_='glyphicon glyphicon-star'))
# 觀察發現,每一個星星會有一次<span class="glyphicon glyphicon-star"></span>,所以我們統計有多少次,就知道有多少個星星了;
# 使用find_all 統計有幾處是★的樣式,第一個參數定位標簽名,第二個參數定位css 樣式
# 由于find_all()返回的結果是列表,我們再使用len()方法去計算列表中的元素個數,也就是星星的數量
}
print(data)
4.總結
4.1爬取步驟
1.使用BeautifuSoup解析網頁內容
首先使用open語句打開網頁,然后使用BeautifulSoup語句解析網頁。
2.描述網頁爬取的東西
此過程分以下幾步實現:
首先,使用瀏覽器工具得到所抓取信息的Css Path。
其次,由于BeautifulSoup不支持nth-child語法,去掉上一步中獲取Css Path的nth-child語法。
再次,使用select方法對爬取信息進行描述。
3.從標簽中獲取所需的東西然后裝入字典中。
在此過程中,使用了for語句和find函數。
4.2相關語句的用法解釋
1.open語句
open語句使用方法
2.BeautifulSoup語句
BeautifulSoup語句使用方法
3.select語句
select語句使用方法
4.find語句
find_all( name , attrs , recursive , text , **kwargs )
find_all()
方法搜索當前tag的所有tag子節點,并判斷是否符合過濾器的條件.詳細見:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/#find-all