当前位置: 首页 > news >正文

【Python】01快速上手爬虫案例一:搞定豆瓣读书

文章目录

  • 前言
  • 一、VSCode+Python环境搭建
  • 二、爬虫案例一
    • 1、爬取第一页数据
    • 2、爬取所有页数据
    • 3、格式化html数据
    • 4、导出excel文件


前言

实战是最好的老师,直接案例操作,快速上手。

案例一,爬取数据,最终效果图:

在这里插入图片描述


一、VSCode+Python环境搭建

开发环境:MacBook Pro + VSCode + Python。

打开最新版VSCode,安装Python开发环境,快捷键:cmd+shift+x。

在这里插入图片描述
选择Python解释器,快捷键:cmd+shift+p。输入:Python: Select Interpreter,选择解释器。
在这里插入图片描述
写“hello world”。
新建文件,输入print(‘hello world~’),另存为hello.py文件。
shift+enter 运行:
在这里插入图片描述

二、爬虫案例一

以爬取“豆瓣读书TOP250”的书籍为案例。

网址链接:https://book.douban.com/top250?start=0

1、爬取第一页数据

代码如下:

import requests
def askUrl(url):head = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15"}html=""  r = requests.get(url, headers = head) html = r.text print(html)  return htmlif __name__ == "__main__": askUrl("https://book.douban.com/top250?start=0") 

head->User-Agent的值可以从这个地方获取:

在这里插入图片描述
如果import requests报错,使用pip3 install requests安装。

运行之后,结果如下:

在这里插入图片描述

第一页25个,都以html的形式显示了出来,第25个为书籍《野草》。

2、爬取所有页数据

代码如下:


import requests
def askUrl(url):head = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15"}r = requests.get(url, headers = head)html = r.textprint(html)def getData(baseurl):for i in range(0, 10):url = baseurl + str(i * 25)html = askUrl(url)if __name__ == "__main__": baseurl = "https://book.douban.com/top250?start="getData(baseurl)

运行之后,结果如下:

在这里插入图片描述

最后一页,最后一个,为书籍《哈姆莱特》。

3、格式化html数据

上面1和2,只是输出了html源码,现在按自己需要的几个字段进行格式化。

分别取这4个字段:封面图、书籍名称、作者(出版社、价格等)、引用。

在这里插入图片描述

这里使用lxml库,解析html。

# 导入lxml库子模块etree
from lxml import etree 

格式化代码如下:

import requests
from lxml import etree def askUrl(url):head = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15"}html=""  r = requests.get(url, headers = head) html = r.text parse = etree.HTML(html)  # 数据# all_tr = parse.xpath('/html[@class="ua-mac ua-webkit book-new-nav"]/body/div[@id="wrapper"]/div[@id="content"]/div[@class="grid-16-8 clearfix"]/div[@class="article"]/div[@class="indent"]/table')all_tr = parse.xpath('//*[@id="content"]/div/div[1]/div/table')for tr in all_tr:tr_data = {'vover': ''.join(tr.xpath('./tr/td[1]/a/img/@src')).strip(), # 封面图'name': ''.join(tr.xpath('./tr/td[2]/div[@class="pl2"]/a/text()')).strip(), # 书名'author': ''.join(tr.xpath('./tr/td[2]/p[1]/text()')).strip(), # 作者'quote': ''.join(tr.xpath('./tr/td[2]/p[2]/span/text()')).strip() # 引用}print(tr_data)if __name__ == "__main__": askUrl("https://book.douban.com/top250?start=0") 

如果报错:

urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. 

解决方法:

pip3 install urllib3==1.26.15

结果如下:

在这里插入图片描述

数据,已经非常清晰了。

PS:使用parse.xpath,最重要的是获取到准确的xpath值。

两个方法:

方法一:Google Chrome浏览器插件:xpath helper。

效果如下:

弹出插件面板:cmd+shift+x。

选中:shift。

在这里插入图片描述
取到的值为:

# 原始值
/html[@class='ua-mac ua-webkit book-new-nav']/body/div[@id='wrapper']/div[@id='content']/div[@class='grid-16-8 clearfix']/div[@class='article']/div[@class='indent']/table[1]/tbody/tr[@class='item']# 优化后的值(使用此值,去掉了tbody和[1])
/html[@class='ua-mac ua-webkit book-new-nav']/body/div[@id='wrapper']/div[@id='content']/div[@class='grid-16-8 clearfix']/div[@class='article']/div[@class='indent']/table

方法二:Google Chrome浏览器,查看源代码。

在这里插入图片描述

取到的值为:

# 原始值
//*[@id="content"]/div/div[1]/div/table[1]/tbody/tr# 优化后的值(使用此值,去掉了tbody和[1])
//*[@id="content"]/div/div[1]/div/table

每一个字段对应的xpath值,也是这么获取。

4、导出excel文件

生成csv格式文件。

导入csv库:

import csv

导出cvs文件(第一页25条),代码如下:

import requests
from lxml import etree 
import csvdef askUrl(url):head = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15"}html=""  r = requests.get(url, headers = head) html = r.text parse = etree.HTML(html)  # 数据all_tr = parse.xpath('//*[@id="content"]/div/div[1]/div/table')# 创建book.csv文件with open('book.csv', 'a', encoding='utf_8_sig', newline='') as fp:  header = ['封面','名称', '作者', '引用']  writer = csv.writer(fp)  writer.writerow(header)for tr in all_tr:tr_data = {'vover': ''.join(tr.xpath('./tr/td[1]/a/img/@src')).strip(), # 封面图'name': ''.join(tr.xpath('./tr/td[2]/div[@class="pl2"]/a/text()')).strip(), # 书名'author': ''.join(tr.xpath('./tr/td[2]/p[1]/text()')).strip(), # 作者'quote': ''.join(tr.xpath('./tr/td[2]/p[2]/span/text()')).strip() # 引用}# print(tr_data)# 写入数据行with open('book.csv', 'a', encoding='utf_8_sig', newline='') as fp:  fieldnames = ['vover','name', 'author', 'quote']  writer = csv.DictWriter(fp, fieldnames)  writer.writerow(tr_data)if __name__ == "__main__": askUrl("https://book.douban.com/top250?start=0") 

导出的book.csv文件(第一页),如下:

在这里插入图片描述

导出cvs文件(所有的250条),代码如下:

import requests
from lxml import etree 
import csvdef askUrl(url):head = { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15"}r = requests.get(url, headers = head)html = r.text# print(html)parse = etree.HTML(html)all_tr = parse.xpath('//*[@id="content"]/div/div[1]/div/table')for tr in all_tr:tr_data = {'vover': ''.join(tr.xpath('./tr/td[1]/a/img/@src')).strip(), # 封面图'name': ''.join(tr.xpath('./tr/td[2]/div[@class="pl2"]/a/text()')).strip(), # 书名'author': ''.join(tr.xpath('./tr/td[2]/p[1]/text()')).strip(), # 作者'quote': ''.join(tr.xpath('./tr/td[2]/p[2]/span/text()')).strip() # 引用}# print(tr_data)# 写入数据行with open('bookall.csv', 'a', encoding='utf_8_sig', newline='') as fp:  fieldnames = ['vover','name', 'author', 'quote']  writer = csv.DictWriter(fp, fieldnames)  writer.writerow(tr_data)def getData(baseurl):# 创建book.csv文件with open('bookall.csv', 'a', encoding='utf_8_sig', newline='') as fp:  header = ['封面','名称', '作者', '引用']  writer = csv.writer(fp)  writer.writerow(header)# 插入25页的数据for i in range(0, 10):url = baseurl + str(i * 25)html = askUrl(url)if __name__ == "__main__": baseurl = "https://book.douban.com/top250?start="getData(baseurl)

导出的book.csv文件(所有页250条数据),如下:

在这里插入图片描述


相关文章:

【Python】01快速上手爬虫案例一:搞定豆瓣读书

文章目录 前言一、VSCodePython环境搭建二、爬虫案例一1、爬取第一页数据2、爬取所有页数据3、格式化html数据4、导出excel文件 前言 实战是最好的老师,直接案例操作,快速上手。 案例一,爬取数据,最终效果图: 一、VS…...

JavaEE 网络编程

JavaEE 网络编程 文章目录 JavaEE 网络编程引子1. 网络编程-相关概念1.1 基本概念1.2 发送端和接收端1.3 请求和响应1.4 客户端和服务端 2. Socket 套接字2.1 数据包套接字通信模型2.2 流套接字通信模型2.3 Socket编程注意事项 3. UDP数据报套接字编程3.1 DatagramSocket3.2 Da…...

5.rk3588用cv读取图片(C++)

rk3588自带了cv&#xff0c;不需要重新安装&#xff0c;执行以下操作即可&#xff1a; 一、读取图片 1.读取某张图片 #define HAVE_OPENCV_VIDEO #define HAVE_OPENCV_VIDEOIO#include <opencv2/opencv.hpp> #include <iostream> #include <opencv2/opencv.h…...

Github 无法正常访问?一招解决

查询IP网址: https://ip.chinaz.com/ 主页如下&#xff1a; 分别查询以下三个网址的IP&#xff1a; github.com github.global.ssl.fastly.net assets-cdn.github.com 修改 hosts 文件&#xff1a; 将 /etc/hosts 复制到 home 下 sudo cp /etc/hosts ./ gedit hosts 在底下…...

架构师的36项修炼-08系统的安全架构设计

本课时讲解系统的安全架构。 本节课主要讲 Web 的攻击与防护、信息的加解密与反垃圾。其中 Web 攻击方式包括 XSS 跨站点脚本攻击、SQL 注入攻击和 CSRF 跨站点请求伪造攻击&#xff1b;防护手段主要有消毒过滤、SQL 参数绑定、验证码和防火墙&#xff1b;加密手段&#xff0c…...

docker 构建应用

docker 应用程序开发手册 开发 docker 镜像 Dockerfile 非常容易定义镜像内容由一系列指令和参数构成的脚本文件每一条指令构建一层一个 Dockerfile 文件包含了构建镜像的一套完整指令指令不区分大小写&#xff0c;但是一般建议都是大写从头到尾按顺序执行指令必须以 FROM 指…...

Go语言grpc服务开发——Protocol Buffer

文章目录 一、Protocol Buffer简介二、Protocol Buffer编译器安装三、proto3语言指南四、序列化与反序列化五、引入grpc-gateway1、插件安装2、定义proto文件3、生成go文件4、实现Service服务5、gRPC服务启动方法6、gateway服务启动方法7、main函数启动8、验证 相关参考链接&am…...

【开源】基于JAVA语言的实验室耗材管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗材出库模块2.4 耗材申请模块2.5 耗材审核模块 三、系统展示四、核心代码4.1 查询耗材品类4.2 查询资产出库清单4.3 资产出库4.4 查询入库单4.5 资产入库 五、免责说明 一、摘要 1.1…...

金智易表通构建学生缴费数据查询+帆软构建缴费大数据报表并整合到微服务

使用金智易表通挂接外部数据,快速建设查询类服务,本次构建学生欠费数据查询,共有3块设计,规划如下: 1、欠费明细查询:学校领导和财务处等部门可查询全校欠费学生明细数据;各二级学院教职工可查询本二级学院欠费学生明细数据。 2、大数据统计报表:从应收总额、欠费总额…...

MySQL复合索引

复合索引是指在数据库表上同时包含两个或更多列的索引。它们对于优化涉及这些列的查询非常有效&#xff0c;特别是当这些列常常在查询条件&#xff08;如WHERE子句&#xff09;、排序&#xff08;ORDER BY子句&#xff09;和连接&#xff08;JOIN条件&#xff09;中使用时。 复…...

Web3 游戏开发者的数据分析指南

作者&#xff1a;lesleyfootprint.network 在竞争激烈的 Web3 游戏行业中&#xff0c;成功不仅仅取决于游戏的发布&#xff0c;还需要在游戏运营过程中有高度的敏锐性&#xff0c;以应对下一次牛市的来临。 人们对 2024 年的游戏行业充满信心。A16Z GAMES 和 GAMES FUND ONE …...

temu跨境电商怎么样?做temu蓝海项目有哪些优势?

在全球电商市场激烈的竞争中&#xff0c;Temu跨境电商平台以其独特的优势和策略&#xff0c;逐渐崭露头角。对于许多想要拓展海外市场的商家来说&#xff0c;Temu的蓝海项目提供了一个充满机遇的新平台。本文将深入探讨Temu跨境电商的优势以及在蓝海市场中的发展前景。 全球化市…...

C#使用RabbitMQ-1_Docker部署并在c#中实现简单模式消息代理

介绍 RabbitMQ是一个开源的消息队列系统&#xff0c;实现了高级消息队列协议&#xff08;AMQP&#xff09;。 &#x1f340;RabbitMQ起源于金融系统&#xff0c;现在广泛应用于各种分布式系统中。它的主要功能是在应用程序之间提供异步消息传递&#xff0c;实现系统间的解耦和…...

EasyExcel中自定义拦截器的运用

在EasyExcel中自定义拦截器不仅可以帮助我们不止步于数据的填充&#xff0c;而且可以对样式、单元格合并等带来便捷的功能。下面直接开始 我们定义一个MergeWriteHandler的类继承AbstractMergeStrategy实现CellWriteHandler public class MergeLastWriteHandler extends Abst…...

shell编程-7

shell学习第7天 sed的学习1.sed是什么2.sed有两个空间pattern hold3.sed的语法4. sed里单引号和双引号的区别:5.sed的查找方式6.sed的命令sed的标签用法sed的a命令:追加sed的i命令:根据行号插入sed的c命令:整行替换sed的r命令sed的s命令:替换sed的d命令:删除sed中的&符号 7…...

工业智能网关储能物联网应用实现能源的高效利用及远程管理

储能电力物联网是指利用物联网技术和储能技术相结合&#xff0c;实现对电力系统中各种储能设备的智能管理和优化控制。随着可再生能源的不断发展和应用&#xff0c;电力系统面临着越来越大的电力调度和储能需求而储能电力物联网的出现可以有效解决这一问题&#xff0c;提高电力…...

虹科数字化与AR部门升级为安宝特AR子公司

致关心虹科AR的朋友们&#xff1a; 感谢您一直以来对虹科数字化与AR的支持和信任&#xff0c;为了更好地满足市场需求和公司发展的需要&#xff0c;虹科数字化与AR部门现已升级为虹科旗下独立子公司&#xff0c;并正式更名为“安宝特AR”。 ”虹科数字化与AR“自成立以来&…...

服务器是什么?(四种服务器类型)

服务器 服务器定义广义: 专门给其他机器提供服务的计算机。狭义:一台高性能的计算机&#xff0c;通过网络提供外部计算机一些业务服务 个人PC内存大概8G&#xff0c;服务器内存128G起步 服务器是什么 服务器指的是 网络中能对其他机器提供某些服务的计算机系统 &#xff0c;相对…...

09-微服务Sentinel整合GateWay

一、概述 在微服务系统中&#xff0c;网关提供了微服务系统的统一入口&#xff0c;所以我们在做限流的时候&#xff0c;肯定是要在网关层面做一个流量的控制&#xff0c;Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 1.1 总览 Sentinel 1.6.…...

python基础学习-03 安装

python3 可应用于多平台包括 Windows、Linux 和 Mac OS X。 Unix (Solaris, Linux, FreeBSD, AIX, HP/UX, SunOS, IRIX, 等等。)Win 9x/NT/2000Macintosh (Intel, PPC, 68K)OS/2DOS (多个DOS版本)PalmOSNokia 移动手机Windows CEAcorn/RISC OSBeOSAmigaVMS/OpenVMSQNXVxWorksP…...

HTML — 区块元素

HTML 通过各种标签将元素组合起来。 一. 区块元素 大多数 HTML 元素被定义为块级元素或内联元素。块级元素在浏览器显示时&#xff0c;通常会以新的行开始。例如&#xff1a;<div>、<h1>、<p>、<ul>等。 它们在使用时会独自占据一行&#xff0c;称为块…...

《PCI Express体系结构导读》随记 —— 第I篇 第3章 PCI总线的数据交换(4)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第3章 PCI总线的数据交换&#xff08;3&#xff09; 3.2 PCI设备的数据传递 PCI设备的数据传递使用地址译码方式&#xff0c;当一个存储器读写总线事务到达PCI总线时&#xff0c;在这条总线上的所有PCI设…...

力扣0083——删除排序链表中的重复元素

删除排序链表中的重复元素 难度&#xff1a;简单 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例1 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例2 输入&#xff1a…...

MySQL数据库的一些缩写含义

DDL Data Definition Language&#xff0c;数据定义语言&#xff0c;用来定义数据库对象(数据库&#xff0c;表&#xff0c;字段) DML DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进 行增、删、改操作。 添加数据&#x…...

解决 ssh: connect to host github.com port 22: Connection timed out

问题 今天使用git克隆github上的代码时&#xff0c;一直报错 原以为是公钥过期了&#xff0c;就尝试修改配置公钥&#xff0c;但是尝试了几次都不行&#xff0c;最终在博客上找到了解决方案&#xff0c;在次记录一下&#xff0c;以备不时之需 解决ssh-connect-to-host-github…...

【iOS ARKit】同时开启前后摄像头BlendShapes

在上一节中已经了解了 iOS ARkit 进行BlendShapes的基本操作&#xff0c;这一小节继续实践同时开启前后摄像头进行人脸捕捉和世界追踪。 iOS设备配备了前后两个摄像头&#xff0c;在运行AR 应用时&#xff0c;需要选择使用哪个摄像头作为图像输人。最常见的AR 体验使用设备后置…...

Vue3动态插入组件

一、使用<component>is实现动态组件插入 <component>&#xff1a;一个用于渲染动态组件或元素的“元组件”。 :is : 要渲染的实际组件&#xff0c;当 is 是字符串&#xff0c;它既可以是 HTML 标签名也可以是组件的注册名。 <script> import Foo from ./F…...

介绍一下OpenCV中常用的图像处理函数

OpenCV中常用的图像处理函数有很多&#xff0c;以下是其中一些函数的介绍&#xff1a; - cvLoadImage()&#xff1a;读入图像函数。 - imshow()&#xff1a;显示图像函数。 - imwrite()&#xff1a;保存图像函数。 - Mat srcImage imread()&#xff1a;读入图像函数。 - …...

vscode vim 快捷键汇总

需满足操作&#xff1a; 上下移动按照 word 移动选中增删改查找字符/变量移动、增加、复制、删除 行选中多个相同的变量/字符屏幕移动增加多个光标快速注释 上下左右移动 CommandDescription&#x1f522; hleft (also: CTRL-H, BS, or Left key)&#x1f522; lright (also…...

npm官方注册表和淘宝镜像切换

1.切换到淘宝镜像 加快npm包的下载速度&#xff0c; //已失效 //npm config set registry https://registry.npm.taobao.org/ npm config set registry https://registry.npmmirror.com这会将npm的注册表设置为淘宝镜像 查看&#xff1a; npm config get registry如果返回的…...

中国室内设计艺术千年回眸/2021百度seo

目录前言sudo介绍sudo的使用前提 --- 配置文件/etc/sudoers结语前言 最近通知 linux 期末考试啦&#xff01;要上机实操并且要求不能使用 root 用户&#xff0c;因此有些操作需要涉及到权限问题&#xff0c;我们都知道在命令前加sudo就行了&#xff0c;但sudo的使用也是有前提…...

手机交互网站/福建百度推广开户

我正在运行一个大的PHP脚本,它可能需要一整天才能完成它的工作,这个脚本从MySQL数据库中获取数据并将其与curl一起使用来测试东西……它用大约40,000条记录来实现它.因此,为了使它在后台运行,只要它需要,我使用终端执行它..在PHP脚本本身它有这些设置,以确保它运行尽可能长,直到…...

wordpress自定义菜单的输出/全网搜索关键词查询

潮阳区普通高中分数线汕头金山中学&#xff1a;计划生793分(同分投档序&#xff1a;12);汕头一中&#xff1a;计划生778分(同分投档序&#xff1a;23);潮阳一中&#xff1a;计划生746分(同分投档序&#xff1a;79),扩招生731分(同分投档序&#xff1a;90);林百欣中学&#xff1…...

网站如何做二级域名/发布软文广告

现实的创作来源于生活的灵感&#xff01; 项目引入 昨天突然发现有一个比较头疼的问题&#xff0c;有一份数据是某一个学校的寝室数据&#xff0c;有不同的维度的分类&#xff0c;总的数据大概有4000数据&#xff0c;需要进行分类&#xff0c;然后按照不同分类维度进行表格制作…...

东莞最好的网站建设/登封seo公司

<jsp:include>动作元素 (1)<jsp:include>动作元素 <jsp:include>动作元素用来包含静态和动态的文件。该动作把指定文件插入正在生成的页面。 <jsp:include>动作元素语法格式如下&#xff1a; <jsp:include page"相对URL地址" flush"…...

衢州集团网站建设/青岛seo网站关键词优化

/*获得当前系统时间&#xff0c;插入到mysql数据库&#xff0c;数据库中的数据类型为datatime,对应于java.sql.Timestamp *时间格式为yyyy-MM-ddHH:mm:ss *pst.setTimestamp(4, new java.sql.Timestamp(new java.util.Date().getTime())); …...