Python3使用xpath爬取豆丁网文档
Python3使用xpath爬取豆丁網(wǎng)文檔(已不適用,僅供參考)
- 準(zhǔn)備工作
- 源代碼
準(zhǔn)備工作
首先,我們進(jìn)入豆丁官網(wǎng),隨便點(diǎn)擊一篇文檔,進(jìn)入如下界面:
接著,按“F12”進(jìn)入開發(fā)者工具;找到圖中所示的HTML標(biāo)簽(可在開發(fā)者工具中搜索圖中關(guān)鍵詞匯);定位的光標(biāo)處中src中的鏈接則是我們后續(xù)下載需要的URL地址(在瀏覽器中搜索上述地址,就會發(fā)現(xiàn)第一頁以圖片的形式呈現(xiàn)在了網(wǎng)頁中,這時(shí)我們便可以右鍵進(jìn)行保存)。
細(xì)心的讀者就會發(fā)現(xiàn),這其中是有跡可循的。所有的頁面都會一一對應(yīng)一個(gè)div<id=“page_1,2,……”>,而我們所需要的URL地址都在這一標(biāo)簽下的img標(biāo)簽中,所以這就是我們本次要爬的重點(diǎn)。
注意事項(xiàng):值得注意的是,你進(jìn)入網(wǎng)站后,會發(fā)現(xiàn)網(wǎng)站后續(xù)的圖片是沒有刷新出來的,而沒有刷新出來的頁面是沒有上述所說的div標(biāo)簽,所以是無法爬取的。這是該網(wǎng)站設(shè)計(jì)的反爬蟲機(jī)制,防止你直接通過網(wǎng)址進(jìn)行爬蟲。
所以,無法通過該網(wǎng)頁的url進(jìn)行爬取。借鑒筆者前兩篇文章:
爬取百度文庫文檔
爬取原創(chuàng)力文檔
舉一反三,復(fù)制開發(fā)者工具界面(div id=“contentcontainer”)這一標(biāo)簽里的源碼(因人而異,讀者也可以復(fù)制所有的源碼,但是后續(xù)的xpath路徑也要隨之改變)復(fù)制到txt文件中,再讀取txt文件(如果讀者有更好的解決辦法,歡迎在評論區(qū)交流學(xué)習(xí)!)
- 值得注意的是,一定要把所有頁面全部加載出來,不然有些頁面就沒有src地址
好的,啰嗦了這么多。下面,讓我們進(jìn)入源代碼環(huán)節(jié)(其實(shí),和前面兩篇文章結(jié)構(gòu)一樣,本質(zhì)上是換湯不換藥)。
源代碼
""" 爬取豆丁文檔網(wǎng)站上的文檔 """ from urllib.request import urlretrieve import time from lxml import etree import numpy as npfrom docx import Document from os import listdir from docx.shared import Inches from docx.shared import Cm import osdir_path = 'F:\PycharmProjects\Scrapy\\results' # 要保存的文件夾目錄# 刪除文件夾下原有的jpg文件 def del_img():for files in os.listdir(dir_path):if files.endswith(".jpg"):os.remove(os.path.join(dir_path, files))# 從html.txt文件中讀取網(wǎng)頁源碼下載圖片,并從數(shù)字1按順序依次對圖片命名 def print_img(results):results = etree.HTML(results)content_list = results.xpath('//*[@id="contentcontainer"]/div')for content in content_list:img_url = content.xpath('.//div[1]/div/img/@src')# 設(shè)個(gè)延時(shí)time.sleep(np.random.randint(0, 1))if len(img_url):img_url = img_url[0].strip()img_name = content.xpath('.//div[1]/div/@id')img_name = img_name[0].strip()num = int(img_name[4:])img_name = dir_path + str(num) + '.jpg'# 根據(jù)src地址下載圖片,下載目錄默認(rèn)是當(dāng)前工作路徑urlretrieve(img_url, img_name)print('打印第', num, '張成功!')# 將圖片加載進(jìn)word文檔,并保存 def print_docx():docx = Document()# 將文檔的頁面邊距均設(shè)為0sections = docx.sectionsfor section in sections:section.top_margin = Cm(0)section.bottom_margin = Cm(0)section.left_margin = Cm(0)section.right_margin = Cm(0)pictures = [fn for fn in listdir(dir_path) if fn.endswith('.jpg')]pictures.sort()pictures.sort(key=lambda x: int(x[:-4]))print(pictures)for img_name in pictures:img_name = dir_path + img_namedocx.add_picture(img_name, height=Inches(11))print(img_name, '添加成功!')# 保存文檔docx_name = '豆丁'docx_name = docx_name + '.docx' # 文檔名字docx.save(docx_name)print(docx_name, '保存成功!')if __name__ == '__main__':with open('html.txt', 'r', encoding='utf-8') as file:data = file.read()# 刪除原有的jpgdel_img()# 下載jpgprint_img(data)# 將jpg導(dǎo)入docxprint_docx()xpath地址不知道的讀者同樣可以參考前面兩篇文章:
爬取百度文庫文檔
爬取原創(chuàng)力文檔
總結(jié)
以上是生活随笔為你收集整理的Python3使用xpath爬取豆丁网文档的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021-07-31
- 下一篇: 一篇文章搞懂什么是测试,测试是干什么的?