練手:requests庫爬取小說,Xpath基本提取語法


Xpath基本提取語法:
# Chrome輔助插件XPath Helper
# Firefox輔助插件Try XPath

# XPath語法:
#  '//'獲取整個頁面當中的元素,然后寫標簽名,然后寫謂詞
# '/'代表只獲取直接子節點,'//'代表根節點下面
# //div[@id] 選擇所有擁有id屬性的div節點
# //span[@class] 選擇所有擁有class屬性的span節點 # //div[2] 按順序查找第2個div節點,下標從1開始 # //div[contains(@id,'top')] 如果該屬性包含了多個屬性值,可以模糊查找id屬性中包含top的div節點 # //span[@class='unknown-icon'] | //span[@class='show-city'] '|'可以選擇多個路徑 # .//a/@href 可以取到a標簽下的href屬性(在//之前加一個點,代表是在當前元素下獲取) # //div[@id="content"]/text() text()函數可以取到id屬性為"content"的div標簽下面的所有文本內容
# //span//text() 第一個‘//’表示根節點下面,第二個‘//’表示獲取非直接子節點

 

requests庫爬取筆趣閣免費小說:

思路:

1.爬取小說的所有章節目錄;

2.爬取小說每一章節的文本內容;

3.爬取小說所有章節的文本內容;

4.將爬取的小說內容寫入到本地文件(這一步也可以放到第2步中同時進行)

import requests
from lxml import etree

BaseUrl = 'https://www.biqugetv.com'
HEADWES = {
    'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) '
         'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36'
}

# 獲取所有小說章節目錄,並存放到一個mu_url列表
def get_mu_url(url): resp = requests.get(url,headers = HEADWES) text = resp.content.decode('utf-8',errors='ignore') #print(text) html = etree.HTML(text) dd = html.xpath('//div[@id="list"]//dd') mu_url = [] for d in dd: mu_urls = d.xpath('.//a/@href') for a in mu_urls: mu_url.append(BaseUrl+a) # 由於爬取的目錄鏈接是不完整的,可以自定義一個基礎目錄,將其拼接為完整的目錄地址 return mu_url
# 獲取一個章節的小說內容,並將其存入一個字符串txt中,然后將這個字符串寫入到指定的文件中
def get_txt(mu_url): resp = requests.get(mu_url,headers=HEADWES) text = resp.content.decode('utf-8',errors='ignore') #print(text) html = etree.HTML(text) content = html.xpath('//div[@id="content"]/text()') #print(content) txt = '' for i in range(len(content)): txt = txt+content[i].strip()+'\n' # strip()去掉首位空格字符,‘\n’換行 txt = txt.replace('筆趣閣TV手機端https://m.biqugetv.com/','') # replace()可以替換不需要的字符串
  # 寫入文本,‘a’表示接上寫入 with open(
'/Users/xx/Desktop/未命名文件夾/美人.txt','a',encoding='utf-8') as f: f.write(txt+'\n')
# 獲取所有的小說內容
def get_all_txt(url): mu_url = get_mu_url(url)
  # 循環取出目錄列表中的章節目錄,並將章節目錄作為參數傳入get_txt()中,得到每一章節的文本內容
for a in mu_url: get_txt(a) if __name__ == '__main__': url = 'https://www.biqugetv.com/45_45193/' # url是總目錄的鏈接地址 get_all_txt(url)

 

resp.content和resp.text的區別:

# response.content:這個是直接從網絡上面抓取的數據。
# 沒有經過任何解碼。所以是一個bytes類型。其實在硬盤上和網絡上傳輸的字符串都是bytes類型。
# response.text:這個是str的數據類型,是requests庫將response.content進行解碼的字符串。
# 解碼需要指定一個編碼方式,requests會根據自己的猜測來判斷編碼的方式。
# 所以有時候可能會猜測錯誤,就會導致解碼產生亂碼,
# 這時候應該使用'response.content.decode('utf-8')'進行手動解碼。

 

使用lxml.etree解析html字符串和html文件的區別:

# 解析html字符串:使用'lxml.etree.HTML'進行解析,示例代碼如下
htmlElement = etree.HTML(text)
print(etree.tostring(htmlElement,encoding='utf-8').decode('utf-8'))

'''
解析html文件:使用'lxml.etree.parse'進行解析,這個函數默認使用的是'XML'解析器,所以如果碰到一些不規范的'HTML'代碼的時候就會解析出錯,
這時候就需要自己創建'HTML'解析器。
'''
parser = etree.HTMLParser(encoding='utf-8')
htmlElement = etree.parse('boke.html',parser=parser)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM