Python3使用xpath爬取豆丁网文档

news/2024/11/29 3:46:21/

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地址不知道的读者同样可以参考前面两篇文章:
爬取百度文库文档
爬取原创力文档


http://www.ppmy.cn/news/831010.html

相关文章

仿百度文库、豆丁文档网站源码在线文档分享系统最新版+带全套工具

非常棒的一套在线文档分享系统源码&#xff0c;仿百度文库、豆丁文档网站源码&#xff0c;在这里完全免费提供给大家学习。在这里无需任何币就可以下载到非常多的精品源码&#xff0c;如果觉得好站长资源做的不错&#xff0c;请帮忙推荐给更多的站长朋友。 此套源码非常干净的…

【JavaScript】豆丁文档保存本地

前言 最近犀牛书看了将近一半&#xff0c;对JavaScript算是有了个大概的了解&#xff0c;于是考虑写一些简单的脚本做个练习 思路 在豆丁网随便找篇文档(测试文档)&#xff0c;通过F12查看网页结构&#xff0c;可以看到文档的每一页实际位于id page_i的canvas元素内&#xff…

windows系统下载大白菜制作iso镜像文件

背景 1. ventory制作了U盘启动盘&#xff0c;ventory只能加载iso文件&#xff0c; 我们有些操作需要进入到winpe系统进行操作&#xff0c;故需要制作大白菜pe的iso文件 操作步骤 下载大白菜 大白菜u盘启动盘制作工具_大白菜u盘装系统_大白菜pe_大白菜官网-首页 (windowsrw.…

MATLAB 点云旋转、平移的刚性变换 (22)

MATLAB 点云旋转、平移的刚性变换 (22) 一、算法介绍二、刚性变换1.初始点云2.变换点云一、算法介绍 点云的变换一般是使用刚性变换,不改变点云整体的形状与尺寸,通常需要通过旋转平移、等来变换点云的位置,如点云配准等。这里介绍一些关于点云变换的基本操作方法。 二、…

前端校验统一社会信用代码

统一社会信用代码规则 由18位的阿拉伯数字或大写英文字母&#xff08;不使用I、O、Z、S、V&#xff09;组成&#xff1b; 第1位~第2位、第9位~第18位 [0-9A-HJ-NP-RT-UW-Y] 第3位~第8位&#xff0c;由阿拉伯数字表示&#xff1b; [0-9]{6} 第18位校验码&#xff0c;按照公…

低代码能够为企业带来什么?

目录 1、为企业快速开发应用赋能 2、低成本使用数字化工具 3、满足企业定制化需求 大数据时代的快速发展下&#xff0c;传统的应用开发技术手段渐渐地无法满足企业的高需求。并且&#xff0c;企业想在应用开发的基础上同时实现个性化定制&#xff0c;而传统的技术条件所需要…

java测试生成中征码(数字)

public class Main {public static void main(String[] args) {//企业中征码为 16位 后2位位验证码String checkZZM checkZZM( String.valueOf((int)(Math.random()*101)) String.valueOf(System.currentTimeMillis()) );System.out.println("企业中征码为&#xff1a;…

java测试生成中征码(包含字母、数字)

public static void main(String[] args) {String val genSixToSixteenPsw();System.out.println("企业中征码为&#xff1a;" val);}/*** 随机14位中证码* return*/public static String genSixToSixteenPsw() {String val "";Random random new Rando…