1. 程式人生 > >Reptile:requests + Xpath 爬取段子網的段子

Reptile:requests + Xpath 爬取段子網的段子

三種 word 可能 art nbsp quest odi 當前 del

2019/1/24 中午路飛學成 爬蟲課程 實驗及筆記。

Xpath是路飛爬蟲課程中老師說的三種解析方式之一,前面是re正則表達式的解析方式,現在是xpath的解析方式,後面還有一個是bs4的解析方式。

re其實我理解的很困難,而且到現在都還不怎麽理解這個東西到底應該怎麽去組合起來,進行匹配,反而這個Xpath我個人覺得比較好理解,他就是通過一步一步的去解析網頁的結構來找到你想要的東西,比如有一個三級的結構,你就可以用xpath一級一級的去往下走,直到到達你需要的點就ok了。而且還可以進行模糊查找和邏輯查找。

下面是代碼:

# 需求:使用xpath對段子網的內容和標題進行解析,並存儲到本地

  import os

  import requests

from lxml import etree

# 指定本地數據存儲位置
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 和請求頭信息
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)

# 發起請求並獲取返回數據:
response = requests.get(url=url, headers=headers)

if response.status_code == 200:
page_text = response.text

# 實例化etree對象,並對獲取的網頁數據進行初步解析
tree = etree.HTML(page_text)
article_list = tree.xpath(‘//article[contains(@id,"")]‘) # 這裏是使用了模糊匹配,用contains取所有包含id的標簽,這個裏面和課程有點不一樣,能是網站更新了吧

# 對初步解析得到的數據進行二次解析,得到標題和正文。xpath得到的Element對象都可以再次調用xpath
for li in article_list:
title = li.xpath(‘./div[@class="post-head"]/h1[1]/a/text()‘)[0] # 解析初標題的信息,存到變量中後面寫入用 ./是表示在當前標簽下去進行查找,當前標簽就是這個的父級標簽
content = li.xpath(‘./div[@class="post-content"]/p[1]/text()‘) # 解析出內容的信息。
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索引錯誤\033[m \n‘)
else:
print("\033[41m鏈接訪問異常,請重新嘗試連接....\033[m")

做這個案例的時候碰到了一個小的問題,就是在後面進行二次解析的時候發現會有拿到的列表中有空的,你對空列表進行切片的時候就會報錯,超出了列表的索引的範圍,沒有想到很好的辦法進行解決,就嘗試使用了
異常處理try 和 except進行處理,沒有問題的就直接寫入到文件裏面去,有問題的就給放在except中去執行,只寫一個列表進去,這個問題只存在在內容裏面,標題是沒有這樣的問題的,因為標題是都有的,內
容呢可能是有些用戶
沒有去寫吧,或者直接就吧標題當成了內容就保存,就會出現空的列表的問題。


Reptile:requests + Xpath 爬取段子網的段子