實(shí)施步驟
(1) 數(shù)據(jù)爬取:使用requests請求為基礎(chǔ)獲取數(shù)據(jù)源。
(2) UA偽裝:模擬瀏覽器訪問網(wǎng)址。
(3) 數(shù)據(jù)解析:使用xpath語法處理數(shù)據(jù)。
(4) 數(shù)據(jù)存儲:獲取需求數(shù)據(jù)后使用Excrl進(jìn)行存儲
目標(biāo)網(wǎng)址
https://ac.qq.com/Comic/all/search/hot/page/1
庫的使用
Openpyxl:openpyxl 模塊是一個讀寫 Excel 2010 文檔的 Python/ target=_blank class=infotextkey>Python 庫,如果要處理更早格式的 Excel 文檔,需要用到其它庫(如:xlrd、xlwt 等),這是 openpyxl 比較其他模塊的不足之處。openpyxl 是一款比較綜合的工具,不僅能夠同時讀取和修改 Excel 文檔,而且可以對Excel文件內(nèi)單元格進(jìn)行詳細(xì)設(shè)置,包括單元格樣式等內(nèi)容,甚至還支持圖表插入、打印設(shè)置等內(nèi)容,使用 openpyxl 可以讀寫xltm, xltx, xlsm, xlsx 等類型的文件,且可以處理數(shù)據(jù)量較大的 Excel 文件,跨平臺處理大量數(shù)據(jù)等。
Requests:requests是基于Python開發(fā)的HTTP 庫,與urllib標(biāo)準(zhǔn)庫相比,它不僅使用方便,而且能節(jié)約大量的工作。實(shí)際上,requests是在urllib的基礎(chǔ)上進(jìn)行了高度的封裝,它不僅繼承了urllib的所有特性,而且還支持一些其它的特性,比如使用Cookie保持會話、自動確定響應(yīng)內(nèi)容的編碼等,可以輕而易舉地完成瀏覽器的任何操作。
Lxml:lxml是一個Python庫,使用它可以輕松處理XML和html文件,還可以用于web爬取。這個庫的主要優(yōu)點(diǎn)是易于使用,在解析大型文檔時速度非常快,歸檔的也非常好,并且提供了簡單的轉(zhuǎn)換方法來將數(shù)據(jù)轉(zhuǎn)換為Python數(shù)據(jù)類型,從而使文件操作更容易。
數(shù)據(jù)采集
簡單分析網(wǎng)頁后發(fā)現(xiàn)該網(wǎng)頁翻頁操作可通過對url的相關(guān)參數(shù)修改得知。
測試如下:
進(jìn)行多次測試得知通過對url相關(guān)參數(shù)修改的確實(shí)現(xiàn)了換頁功能。
!!!!!!
共292頁,我們可以通過簡單的for循環(huán)實(shí)現(xiàn)每一頁的替換。
for n in range(293):
請求數(shù)據(jù)
對url進(jìn)行修飾后使得for循環(huán)的參數(shù)可以對請求的目標(biāo)網(wǎng)址url進(jìn)行影響。
url = f'https://ac.qq.com/Comic/all/search/hot/page/{n}'
因?yàn)榻^大多數(shù)門戶網(wǎng)站的服務(wù)器會檢測對應(yīng)請求的載體身份標(biāo)識,如果檢測到載體身份標(biāo)識為某一瀏覽器說明該請求是一個正常請求. 但是!如果檢測到請求載體身份標(biāo)識不是基礎(chǔ)于某一款瀏覽器的,則表示該請求為不正常請求(爬蟲),則服務(wù)器端就很有可能拒絕該次請求。所以為了應(yīng)對我們進(jìn)行一點(diǎn)小小的操作UA偽裝(UA偽裝:讓爬蟲對應(yīng)的請求載體身份標(biāo)識偽裝成某一款瀏覽器)
這里我們直接復(fù)制瀏覽器的UA讓爬蟲攜帶上就可以進(jìn)行UA偽裝了。
headers={"User-Agent":'Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/85.0.4183.83 Safari/537.36'}
綜上所述采集獲取部分如下:
for n in range(293):
url = f'https://ac.qq.com/Comic/all/search/hot/page/{n}'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
}
response = requests.get(url=url,headers=headers)
數(shù)據(jù)分析
首先對采集的數(shù)據(jù)進(jìn)行簡單的處理。
response = response.text
tree = etree.HTML(response)
對網(wǎng)址進(jìn)行檢查分析。
發(fā)現(xiàn)它的每一頁的每一部漫畫的相關(guān)數(shù)據(jù)在這樣一個li標(biāo)簽里面。
如果大家在學(xué)習(xí)中遇到困難,想找一個python學(xué)習(xí)交流環(huán)境,可以加入我們的python裙,關(guān)注小編,并私信“01”即可進(jìn)裙,領(lǐng)取python學(xué)習(xí)資料,會節(jié)約很多時間,減少很多遇到的難題。
使用xpath進(jìn)行解析
li_all = tree.xpath('/html/body/div[3]/div[2]/div/div[2]/ul/li')
獲取了每一頁的所有漫畫大概內(nèi)容后,就可以對每本的細(xì)節(jié)進(jìn)行分析。
這里我們獲取每本漫畫漫畫名,作者,人氣。
對網(wǎng)頁分析如下:
使用xpath語法解析的
作品名字 = li_all[q].xpath('./div[2]/h3/a/text()')
作者 = li_all[q].xpath('./div[2]/p[1]/text()')
人氣 = li_all[q].xpath('./div[2]/p[2]/span/em/text()')
因?yàn)橐粋€的本數(shù)剛好就是之前
的個數(shù),我們對li標(biāo)簽的列表進(jìn)行長度獲取就可以。
len(li_all)
然后進(jìn)行for循環(huán)遍歷,獲取每頁每本的詳細(xì)數(shù)據(jù)。
for q in range(len(li_all)):
e = li_all[q].xpath('./div[2]/h3/a/text()')
z = li_all[q].xpath('./div[2]/p[1]/text()')
r = li_all[q].xpath('./div[2]/p[2]/span/em/text()')
綜上所述解析獲取部分如下:
response = response.text
tree = etree.HTML(response)
li_all = tree.xpath('/html/body/div[3]/div[2]/div/div[2]/ul/li')
for q in range(len(li_all)):
e = li_all[q].xpath('./div[2]/h3/a/text()')
z = li_all[q].xpath('./div[2]/p[1]/text()')
r = li_all[q].xpath('./div[2]/p[2]/span/em/text()')
源碼
import openpyxl
import requests
from lxml import etree
wb = openpyxl.Workbook() # 新建一個workbook
# print(wb)
ws = wb.active # 調(diào)用正在運(yùn)行的工作表
ws['A1'] = '漫畫';ws['B1'] = '作者名字';ws['C1'] = '人氣'
number = 2
for n in range(293):
url = f'https://ac.qq.com/Comic/all/search/hot/page/{n}'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
}
response = requests.get(url=url,headers=headers)
response = response.text
tree = etree.HTML(response)
li_all = tree.xpath('/html/body/div[3]/div[2]/div/div[2]/ul/li')
for q in range(len(li_all)):
e = li_all[q].xpath('./div[2]/h3/a/text()')
z = li_all[q].xpath('./div[2]/p[1]/text()')
r = li_all[q].xpath('./div[2]/p[2]/span/em/text()')
ws[f'A{number}'] = e[0]
ws[f'B{number}'] = z[0]
ws[f'C{number}'] = r[0]
print('漫畫:',e[0],'n作者名字:',z[0],'n人氣:',r[0])
print()
number += 1
wb.save('./漫畫.xlsx')
結(jié)果演示