AI网络爬虫:批量爬取豆瓣图书搜索结果

工作任务:爬取豆瓣图书搜索结果页面的全部图书信息

在ChatGPT中输入提示词:

你是一个Python编程专家,要完成一个爬虫Python脚本编写的任务,具体步骤如下:

用 fake-useragent库设置随机的请求头;

设置chromedriver的路径为:"D:\Program Files\chromedriver125\chromedriver.exe"

隐藏chromedriver特征;

设置selenium的窗口最大化;

请求标头:

Accept:

text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

Accept-Encoding:

gzip, deflate, br, zstd

Accept-Language:

zh-CN,zh;q=0.9,en;q=0.8

Connection:

keep-alive

Host:

http://search.douban.com

Referer:

https://search.douban.com/book/subject_search?search_text=chatgpt&cat=1001&start=0

Sec-Ch-Ua:

"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"

Sec-Ch-Ua-Mobile:

?0

Sec-Ch-Ua-Platform:

"Windows"

Sec-Fetch-Dest:

document

Sec-Fetch-Mode:

navigate

Sec-Fetch-Site:

same-origin

Sec-Fetch-User:

?1

Upgrade-Insecure-Requests:

1

User-Agent:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36

用selenium打开网页:https://search.douban.com/book/subject_search?search_text=chatgpt&cat=1001&start={pagenumber}

{pagenumber}的值从0开始,以15递增,到285结束;

定位xpath=//*[@id="root"]/div/div[2]/div[1]/div[1]/div[{number}]/div/div/div[1]/a的div标签,提取其文本内容({number}的值是从1到15),写入Excel表格第1列;

定位xpath=//*[@id="root"]/div/div[2]/div[1]/div[1]/div[{number}]/div/div/div[3]的div 标签,提取其文本内容({number}的值是从1到15),写入Excel表格第2列;

保存Excel,Excel文件名为:doubanChatGPT20240606.xlsx, 保存到文件夹:F:\AI自媒体内容\AI行业数据分析

注意:

每一步都要输出信息到屏幕

每爬取1条数据,随机暂停5-8秒;

每爬取完1页数据,随机暂停6-12秒;

设置请求头,以应对网站的反爬虫机制;

有些标签的内容可能为空,导致处理时程序报错,遇到为空标签就直接跳过,继续处理下一个标签;

DataFrame.append 方法在 pandas 1.4.0 版本中已经被弃用,并且在后续版本中被移除。为了解决这个问题,我们可以使用 concat 函数来代替 append;

当前使用的是 Selenium 4 或更高版本,executable_path 参数已经被 service 参数替代了;

忽略 SSL 错误:在 Chrome 选项中添加了 --ignore-certificate-errors 和 --ignore-ssl-errors。

增加错误处理,确保尽量多地捕获和处理异常。

在每次请求前更新 User-Agent。

无头模式:使用 --headless 参数在无头模式下运行,以减少干扰。如果需要在前台运行,可以移除此行。

随机暂停:在请求之间随机暂停,以避免反爬虫机制。

源代码:

import time

import random

import pandas as pd

from fake_useragent import UserAgent

from selenium import webdriver

from selenium.webdriver.chrome.service import Service

from selenium.webdriver.common.by import By

from selenium.webdriver.chrome.options import Options

# 设置chromedriver的路径

chromedriver_path = "D:\\Program Files\\chromedriver125\\chromedriver.exe"

# 创建随机请求头

ua = UserAgent()

# 设置Chrome选项

chrome_options = Options()

chrome_options.add_argument("--start-maximized")

chrome_options.add_argument("--ignore-certificate-errors")

chrome_options.add_argument("--ignore-ssl-errors")

chrome_options.add_argument("--allow-insecure-localhost")

chrome_options.add_argument("--disable-web-security")

chrome_options.add_argument("--disable-site-isolation-trials")

chrome_options.add_argument("--disable-gpu")

chrome_options.add_argument("--no-sandbox")

chrome_options.add_argument("--disable-dev-shm-usage")

chrome_options.add_argument("--headless") # 无头模式运行

# 隐藏chromedriver特征

chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])

chrome_options.add_experimental_option('useAutomationExtension', False)

# 初始化webdriver

service = Service(chromedriver_path)

driver = webdriver.Chrome(service=service, options=chrome_options)

# 设置请求头

headers = {

"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",

"Accept-Encoding": "gzip, deflate, br, zstd",

"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",

"Connection": "keep-alive",

"Host": "http://search.douban.com",

"Referer": "https://search.douban.com/book/subject_search?search_text=chatgpt&cat=1001&start=0",

"Sec-Ch-Ua": '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',

"Sec-Ch-Ua-Mobile": "?0",

"Sec-Ch-Ua-Platform": '"Windows"',

"Sec-Fetch-Dest": "document",

"Sec-Fetch-Mode": "navigate",

"Sec-Fetch-Site": "same-origin",

"Sec-Fetch-User": "?1",

"Upgrade-Insecure-Requests": "1",

"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"

}

# 数据存储列表

data = []

# 爬取网页数据

for pagenumber in range(0, 286, 15):

url = f"https://search.douban.com/book/subject_search?search_text=chatgpt&cat=1001&start={pagenumber}"

print(f"正在爬取页面: {url}")

# 更新 User-Agent

headers["User-Agent"] = ua.random

driver.execute_cdp_cmd('Network.setUserAgentOverride', {"userAgent": headers["User-Agent"]})

driver.get(url)

# 随机暂停以防止反爬

time.sleep(random.uniform(6, 12))

for number in range(1, 16):

try:

# 定位书名的div标签

try:

book_title_xpath = f'//*[@id="root"]/div/div[2]/div[1]/div[1]/div[{number}]/div/div/div[1]/a'

book_title = driver.find_element(By.XPATH, book_title_xpath).text

except Exception as e:

book_title = ""

print(f"无法找到书名,错误: {e}")

# 定位描述的div标签

try:

book_desc_xpath = f'//*[@id="root"]/div/div[2]/div[1]/div[1]/div[{number}]/div/div/div[3]'

book_desc = driver.find_element(By.XPATH, book_desc_xpath).text

except Exception as e:

book_desc = ""

print(f"无法找到描述,错误: {e}")

# 添加数据到列表

data.append([book_title, book_desc])

print(f"爬取到数据: {book_title}, {book_desc}")

# 随机暂停以防止反爬

time.sleep(random.uniform(5, 8))

except Exception as e:

print(f"跳过因错误: {e}")

continue

# 将数据写入Excel文件

columns = ["书名", "描述"]

df = pd.DataFrame(data, columns=columns)

output_path = "F:\\AI自媒体内容\\AI行业数据分析\\doubanChatGPT20240606.xlsx"

df.to_excel(output_path, index=False)

print(f"数据已保存到Excel文件:{output_path}")

driver.quit()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/25495.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NFT 智能合约实战-快速开始(1)NFT发展历史 | NFT合约标准(ERC-721、ERC-1155和ERC-998)介绍

文章目录 NFT 智能合约实战-快速开始(1)NFT发展历史国内NFT市场国内NFT合规性如何获得NFT?如何查询NFT信息?在 OpenSea 上查看我们的 NFT什么是ERC721NFT合约标准ERC-721、ERC-1155和ERC-998 对比ERC721IERC721.sol 接口内容关于合约需要接收 ERC721 资产 onERC721Received…

【教学类-64-02】20240610色块眼力挑战(二)-2-25宫格色差10-100(10倍)(星火讯飞)

背景需求 以下的色块眼里挑战需要人工筛选图片,非常繁琐。 【教学类-64-01】20240607色块眼力挑战(一)-0-255随机底色-CSDN博客文章浏览阅读446次,点赞12次,收藏5次。【教学类-64-01】20240607色块眼力挑战&#xff…

Linux安装Docker | 使用国内镜像

环境 CentOS7 先确认能够上网 curl www.baidu.com返回该输出说明网络OK 步骤一:安装gcc 和 gcc-c yum -y install gccyum -y install gcc-c步骤二:安装Docker仓库 yum install -y yum-utils接下来配置yum的国内镜像 yum-config-manager --add-re…

tomcat服务器之maxHttpHeaderSize

背景:在OA流程表单中,填写了200条数据,一提交,秒报400错误,且请求没有打到后端中(无报错日志),一开始以为是谷歌浏览器的问题,可百度上关于这个错误的解决方案都是清除缓…

转让北京劳务分包地基基础施工资质条件和流程

地基基础资质转让流程是怎样的?对于企业来说,资质证书不仅是实力的证明,更是获得工程承包的前提。而在有了资质证书后,企业才可以安心的准备工程投标,进而在工程竣工后获得收益。而对于从事地基基础工程施工的企业,需…

特种设备起重机指挥题库附答案

1、【多选题】力的三要素是指:( )。(ACD) A、力的大小 B、力的单位 C、力的方向 D、力的作用点 2、【多选题】司索作业规范正确的要求是( )(ABC) A、吊点正确 B、吊索挂设合理 C、绑扎牢靠 D、吊索长短一致 3、【多选题】圆柱形物体兜吊时,一定要放空圈&#…

【python】python GUI编程--tkinter模块初探

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Keil软件仿真的使用

一、软件的初始化设置 初始设置可以按照下图,这里我使用的是STM32F103C8T6,所以单片机型号为STM32F103C8,这个设置在Debug目录下。然后进行时钟的设置,我们板上晶振为8M,这里将时钟改为8. 或许有人想问如果是别的型号单…

Effective Java 1 用静态工厂方法代替构造器

知识点上本书需要会Java语法和lang、util、io库,涉及concurrent和function包。 内容上主要和设计模式相关,代码风格力求清晰简洁,代码尽量复用,组件尽量少依赖,错误尽早发现。 第1个经验法则:用静态工厂方…

Chroium 源码目录结构分析(1):源码目录体积一栏

获取源码 首先,我们拉一份最新的源代码(笔者是2024.6.6日拉取的): fetch --nohistory chromium 源码预处理 如果运行build,会生成许多生成的代码,因此我们不运行build。 然后,把干扰后续分析…

sqlilabs靶场安装

05-sqllabs靶场安装 1 安装 1 把靶场sqli-labs-master.zip上传到 /opt/lampp/htdocs 目录下 2 解压缩 unzip sqli-labs-master.zip3 数据库配置 找到配置文件,修改数据库配置信息 用户名密码,修改为你lampp下mysql的用户名密码,root/123456host:la…

贪吃蛇双人模式设计(2)

敲上瘾-CSDN博客控制台程序设置_c语言控制程序窗口大小-CSDN博客贪吃蛇小游戏_贪吃蛇小游戏csdn-CSDN博客​​​​​​​ 一、功能实现: 玩家1使用↓ → ← ↑按键来操作蛇的方向,使用右Shift键加速,右Ctrl键减速玩家2使用W A S D按键来操…

matlab演示地月碰撞

代码 function EarthMoonCollisionSimulation()% 初始化参数earth_radius 6371; % 地球半径,单位:公里moon_radius 1737; % 月球半径,单位:公里distance 384400; % 地月距离,单位:公里collision_tim…

Astar路径规划算法复现-python实现

# -*- coding: utf-8 -*- """ Created on Fri May 24 09:04:23 2024"""import os import sys import math import heapq import matplotlib.pyplot as plt import time 传统A*算法 class Astar:AStar set the cost heuristics as the priorityA…

Kafka集成flume

1.flume作为生产者集成Kafka kafka作为flume的sink,扮演消费者角色 1.1 flume配置文件 vim $kafka/jobs/flume-kafka.conf # agent a1.sources r1 a1.sinks k1 a1.channels c1 c2# Describe/configure the source a1.sources.r1.type TAILDIR #记录最后监控文件…

基于python-CNN深度学习的水瓶是否装满水识别-含数据集+pyqt界面

代码下载地址: https://download.csdn.net/download/qq_34904125/89374853 本代码是基于python pytorch环境安装的。 下载本代码后,有个requirement.txt文本,里面介绍了如何安装环境,环境需要自行配置。 或可直接参考下面博文…

绘唐2.5一键追爆款2.5免费版

免费分享给您 小说推文工具是一种用于在社交媒体上宣传和推广小说的工具。它可以帮助作者将小说的内容和相关信息以推文的形式快速发布在各种社交媒体平台上,吸引读者的注意力并增加小说的曝光度。 以下是一些小说推文工具可能具备的功能: 1. 编辑和排…

【linux】进程控制——进程创建,进程退出,进程等待

个人主页:东洛的克莱斯韦克-CSDN博客 祝福语:愿你拥抱自由的风 相关文章 【Linux】进程地址空间-CSDN博客 【linux】详解linux基本指令-CSDN博客 目录 进程控制概述 创建子进程 fork函数 父子进程执行流 原理刨析 常见用法 出错原因 进程退出 概…

MyBatis-Plus学习总结

一.快速入门 (一)简介 MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 (二)快速入门 1.准备数据库脚本 2.准备bo…

六、Docker Swarm、Docker Stack和Portainer的使用

六、Docker swarm和Docker stack的使用 系列文章目录1.Docker swarm1.简介2.docker swarm常用命令3.docker node常用命令4.docker service常用命令5.实战案例6.参考文章 2.Docker stack1.简介3.Docker stack常用命令4.实战案例5.常见问题及调错方式1.查看报错信息并尝试解决&am…