溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在python中使用lxml模塊爬取豆瓣

發(fā)布時間:2021-05-11 16:05:26 來源:億速云 閱讀:141 作者:Leah 欄目:開發(fā)技術

怎么在python中使用lxml模塊爬取豆瓣?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

python是什么意思

Python是一種跨平臺的、具有解釋性、編譯性、互動性和面向對象的腳本語言,其最初的設計是用于編寫自動化腳本,隨著版本的不斷更新和新功能的添加,常用于用于開發(fā)獨立的項目和大型項目。

步驟一:

怎么在python中使用lxml模塊爬取豆瓣

分析網頁源代碼可以看到,書籍信息在屬性為的div標簽中,打開發(fā)現(xiàn),我們需要爬取的信息都在標簽內部,通過xpath語法我們可以很簡便的爬取所需內容。

怎么在python中使用lxml模塊爬取豆瓣

(書籍各類信息所在標簽)

所需爬取的內容在 class為post、title、rating、abstract的div標簽中。

步驟二:

先定義爬取函數(shù),爬取所需內容執(zhí)行函數(shù),并存入csv文件

具體代碼如下:  

import requests
from lxml import etree
import time
import csv

#信息頭
headers = {
 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
}

#定義爬取函數(shù)
def douban_booksrank(url):
 res = requests.get(url, headers=headers)
 selector = etree.HTML(res.text)
 contents = selector.xpath('//div[@class="article"]/div[contains(@class,"doulist-item")]') #循環(huán)點
 for content in contents:
 try:
 title = content.xpath('div/div[2]/div[3]/a/text()')[0] #書名
 scores = content.xpath('div/div[2]/div[4]/span[2]/text()') #評分
 scores.append('9.0') #因為有一些書沒有評分,導致列表為空,此處添加一個默認評分,若無評分則默認為9.0
 score = scores[0]
 comments = content.xpath('div/div[2]/div[4]/span[3]/text()')[0] #評論數(shù)量
 author = content.xpath('div/div[2]/div[5]/text()[1]')[0] #作者
 publishment = content.xpath('div/div[2]/div[5]/text()[2]')[0] #出版社
 pub_year = content.xpath('div/div[2]/div[5]/text()[3]')[0] #出版時間
 img_url = content.xpath('div/div[2]/div[2]/a/img/@src')[0] #書本圖片的網址
 img = requests.get(img_url) #解析圖片網址,為下面下載圖片
 img_name_file = 'C:/Users/lenovo/Desktop/douban_books/{}.png'.format((title.strip())[:3]) #圖片存儲位置,圖片名只取前3
 #寫入csv
 with open('C:\\Users\lenovo\Desktop\\douban_books.csv', 'a+', newline='', encoding='utf-8')as fp: #newline 使不隔行
 writer = csv.writer(fp)
 writer.writerow((title, score, comments, author, publishment, pub_year, img_url))
 #下載圖片,為防止圖片名導致格式錯誤,加入try...except
 try:
 with open(img_name_file, 'wb')as imgf:
  imgf.write(img.content)
 except FileNotFoundError or OSError:
 pass
 time.sleep(0.5) #睡眠0.5s
 except IndexError:
 pass
#執(zhí)行程序
if __name__=='__main__':
 #爬取所有書本,共22頁的內容
 urls = ['https://www.douban.com/doulist/1264675/?start={}&sort=time&playable=0&sub_type='.format(str(i))for i in range(0,550,25)]
 #寫csv首行
 with open('C:\\Users\lenovo\Desktop\\douban_books.csv', 'a+', newline='', encoding='utf-8')as f:
 writer = csv.writer(f)
 writer.writerow(('title', 'score', 'comment', 'author', 'publishment', 'pub_year', 'img_url'))
 #遍歷所有網頁,執(zhí)行爬取程序
 for url in urls:
 douban_booksrank(url)

爬取結果截圖如下:

怎么在python中使用lxml模塊爬取豆瓣

怎么在python中使用lxml模塊爬取豆瓣

步驟三:

本次使用Python常用的數(shù)據(jù)分析庫pandas來提取所需內容。pandas的read_csv()函數(shù)可以讀取csv文件并根據(jù)文件格式轉換為Series、DataFrame或面板對象。

此處我們提取的數(shù)據(jù)轉變?yōu)镈ataFrame(數(shù)據(jù)幀)對象,然后通過Matplotlib繪圖庫來進行繪圖。

具體代碼如下:

from matplotlib import pyplot as plt
import pandas as pd
import re

plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus']=False #用來正常顯示負號
plt.subplots_adjust(wsapce=0.5, hspace=0.5) #調整subplot子圖間的距離

pd.set_option('display.max_rows', None) #設置使dataframe 所有行都顯示

df = pd.read_csv('C:\\Users\lenovo\Desktop\\douban_books.csv') #讀取csv文件,并賦為dataframe對象

comment = re.findall('\((.*?)人評價', str(df.comment), re.S) #使用正則表達式獲取評論人數(shù)
#將comment的元素化為整型
new_comment = []
for i in comment:
 new_comment.append(int(i))

pub_year = re.findall(r'\d{4}', str(df.pub_year),re.S) #獲取書籍出版年份
#同上
new_pubyear = []
for n in pub_year:
 new_pubyear.append(int(n))

#繪圖
#1、繪制書籍評分范圍的直方圖
plt.subplot(2,2,1)
plt.hist(df.score, bins=16, edgecolor='black')
plt.title('豆瓣書籍排行榜評分分布', fontweight=700)
plt.xlabel('scores')
plt.ylabel('numbers')

#繪制書籍評論數(shù)量的直方分布圖
plt.subplot(222)
plt.hist(new_comment, bins=16, color='green', edgecolor='yellow')
plt.title('豆瓣書籍排行榜評價分布', fontweight=700)
plt.xlabel('評價數(shù)')
plt.ylabel('書籍數(shù)量(單位/本)')

#繪制書籍出版年份分布圖
plt.subplot(2,2,3)
plt.hist(new_pubyear, bins=30, color='indigo',edgecolor='blue')
plt.title('書籍出版年份分布', fontweight=700)
plt.xlabel('出版年份/year')
plt.ylabel('書籍數(shù)量/本')

#尋找關系
plt.subplot(224)
plt.bar(new_pubyear,new_comment, color='red', edgecolor='white')
plt.title('書籍出版年份與評論數(shù)量的關系', fontweight=700)
plt.xlabel('出版年份/year')
plt.ylabel('評論數(shù)')

plt.savefig('C:\\Users\lenovo\Desktop\\douban_books_analysis.png') #保存圖片
plt.show()

這里需要注意的是,使用了正則表達式來提取評論數(shù)和出版年份,將其中的符號和文字等剔除。

分析結果如下:

怎么在python中使用lxml模塊爬取豆瓣

看完上述內容,你們掌握怎么在python中使用lxml模塊爬取豆瓣的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI