Python3使用xpath爬取豆丁网文档(已不适用,仅供参考)
- 准备工作
- 源代码
准备工作
首先,我们进入豆丁官网,随便点击一篇文档,进入如下界面:
接着,按“F12”进入开发者工具;找到图中所示的HTML标签(可在开发者工具中搜索图中关键词汇);定位的光标处中src中的链接则是我们后续下载需要的URL地址(在浏览器中搜索上述地址,就会发现第一页以图片的形式呈现在了网页中,这时我们便可以右键进行保存)。
细心的读者就会发现,这其中是有迹可循的。所有的页面都会一一对应一个div<id=“page_1,2,……”>,而我们所需要的URL地址都在这一标签下的img标签中,所以这就是我们本次要爬的重点。
注意事项:值得注意的是,你进入网站后,会发现网站后续的图片是没有刷新出来的,而没有刷新出来的页面是没有上述所说的div标签,所以是无法爬取的。这是该网站设计的反爬虫机制,防止你直接通过网址进行爬虫。
所以,无法通过该网页的url进行爬取。借鉴笔者前两篇文章:
爬取百度文库文档
爬取原创力文档
举一反三,复制开发者工具界面(div id=“contentcontainer”)这一标签里的源码(因人而异,读者也可以复制所有的源码,但是后续的xpath路径也要随之改变)复制到txt文件中,再读取txt文件(如果读者有更好的解决办法,欢迎在评论区交流学习!)
- 值得注意的是,一定要把所有页面全部加载出来,不然有些页面就没有src地址
好的,啰嗦了这么多。下面,让我们进入源代码环节(其实,和前面两篇文章结构一样,本质上是换汤不换药)。
源代码
"""
爬取豆丁文档网站上的文档
"""
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文件中读取网页源码下载图片,并从数字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')# 设个延时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'# 根据src地址下载图片,下载目录默认是当前工作路径urlretrieve(img_url, img_name)print('打印第', num, '张成功!')# 将图片加载进word文档,并保存
def print_docx():docx = Document()# 将文档的页面边距均设为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导入docxprint_docx()
xpath地址不知道的读者同样可以参考前面两篇文章:
爬取百度文库文档
爬取原创力文档