Reptile:requests + Xpath 爬取段子网的段子
生活随笔
收集整理的這篇文章主要介紹了
Reptile:requests + Xpath 爬取段子网的段子
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2019/1/24?中午路飛學(xué)成?爬蟲課程?實(shí)驗(yàn)及筆記。
Xpath是路飛爬蟲課程中老師說的三種解析方式之一,前面是re正則表達(dá)式的解析方式,現(xiàn)在是xpath的解析方式,后面還有一個(gè)是bs4的解析方式。
re其實(shí)我理解的很困難,而且到現(xiàn)在都還不怎么理解這個(gè)東西到底應(yīng)該怎么去組合起來,進(jìn)行匹配,反而這個(gè)Xpath我個(gè)人覺得比較好理解,他就是通過一步一步的去解析網(wǎng)頁的結(jié)構(gòu)來找到你想要的東西,比如有一個(gè)三級(jí)的結(jié)構(gòu),你就可以用xpath一級(jí)一級(jí)的去往下走,直到到達(dá)你需要的點(diǎn)就ok了。而且還可以進(jìn)行模糊查找和邏輯查找。
下面是代碼:
# 需求:使用xpath對(duì)段子網(wǎng)的內(nèi)容和標(biāo)題進(jìn)行解析,并存儲(chǔ)到本地
import os
import requests
from lxml import etree# 指定本地?cái)?shù)據(jù)存儲(chǔ)位置
if not os.path.exists('./Duan zi word'):
os.mkdir('Duan zi word')
# 獲取用戶輸入的頁碼范圍
start_page = int(input("Enter a start pageNum:>>>"))
end_page = int(input("Enter a end pageNum:>>>"))
# 打開文件并生成文件句柄
fp = open('Duan zi word/duanzi.txt', 'w', encoding='utf-8')
# 指定url 和請(qǐng)求頭信息
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/65.0.3325.181 Safari/537.36'
}
for num in range(start_page, end_page + 1, 1):
url = 'http://duanziwang.com/page/' + str(num)
# 發(fā)起請(qǐng)求并獲取返回?cái)?shù)據(jù):
response = requests.get(url=url, headers=headers)
if response.status_code == 200:
page_text = response.text
# 實(shí)例化etree對(duì)象,并對(duì)獲取的網(wǎng)頁數(shù)據(jù)進(jìn)行初步解析
tree = etree.HTML(page_text)
article_list = tree.xpath('//article[contains(@id,"")]') # 這里是使用了模糊匹配,用contains取所有包含id的標(biāo)簽,這個(gè)里面和課程有點(diǎn)不一樣,能是網(wǎng)站更新了吧
# 對(duì)初步解析得到的數(shù)據(jù)進(jìn)行二次解析,得到標(biāo)題和正文。xpath得到的Element對(duì)象都可以再次調(diào)用xpath
for li in article_list:
title = li.xpath('./div[@class="post-head"]/h1[1]/a/text()')[0] # 解析初標(biāo)題的信息,存到變量中后面寫入用 ./是表示在當(dāng)前標(biāo)簽下去進(jìn)行查找,當(dāng)前標(biāo)簽就是這個(gè)的父級(jí)標(biāo)簽
content = li.xpath('./div[@class="post-content"]/p[1]/text()') # 解析出內(nèi)容的信息。
try:
fp.write(title + ":" + "\n" + str(content[0]) + "\n\n")
print('\033[31m %s \033[m 已完成寫入' % title)
except:
fp.write(title + ":" + "\n\n")
print('\033[32m索引錯(cuò)誤\033[m \n')
else:
print("\033[41m鏈接訪問異常,請(qǐng)重新嘗試連接....\033[m")
做這個(gè)案例的時(shí)候碰到了一個(gè)小的問題,就是在后面進(jìn)行二次解析的時(shí)候發(fā)現(xiàn)會(huì)有拿到的列表中有空的,你對(duì)空列表進(jìn)行切片的時(shí)候就會(huì)報(bào)錯(cuò),超出了列表的索引的范圍,沒有想到很好的辦法進(jìn)行解決,就嘗試使用了
異常處理try 和 except進(jìn)行處理,沒有問題的就直接寫入到文件里面去,有問題的就給放在except中去執(zhí)行,只寫一個(gè)列表進(jìn)去,這個(gè)問題只存在在內(nèi)容里面,標(biāo)題是沒有這樣的問題的,因?yàn)闃?biāo)題是都有的,內(nèi)
容呢可能是有些用戶沒有去寫吧,或者直接就吧標(biāo)題當(dāng)成了內(nèi)容就保存,就會(huì)出現(xiàn)空的列表的問題。
轉(zhuǎn)載于:https://www.cnblogs.com/wei-yu/p/10317052.html
總結(jié)
以上是生活随笔為你收集整理的Reptile:requests + Xpath 爬取段子网的段子的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DoIP简介
- 下一篇: linux python源码目录结构,T