python爬虫实战训练

前言:哇,今天终于能访问豆瓣了,前几天爬太多次了,网页都不让我访问了(要登录)。

先来个小练习试试手吧!

爬取豆瓣第一页(多页同上篇文章)所有电影的排名、电影名称、星级和评分,并用Excel存储

网址是:豆瓣电影 Top 250  大家先自己尝试一下吧,还是简单的,我就直接放代码了

import requests
from bs4 import BeautifulSoup
import pandas as pd
headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}
r=requests.get("https://movie.douban.com/top250",headers=headers)
if r.status_code!=200:raise Exception("error")
soup=BeautifulSoup(r.text,"html.parser")
datas=[['排名','电影名称','星级','评分']]
articles=soup.find_all('div',class_='item')
for article in articles:rank=article.find('em').get_text()title=article.find('span',class_='title').get_text()    #星级在class属性里,get('class')返回的是列表,因为HTML的class属性可以包含多个类名,因此BeautifulSoup将其存储为一个列表star=article.find('div',class_='bd').find('span').get('class')[0].replace('rating','').replace('-t','') #string的replace方法,只保留数字score=article.find('span',class_='rating_num').get_text()datas.append([rank,title,star,score])
df=pd.DataFrame(datas)
df.to_excel('doubanTop25.xlsx')

easy吧,不过,值得提一下的是,网页带小数星级的表示不准确,4.5星级为45

可以观察到star与score都在同一个div标签下,所以还可以用这两行代码代替

data=article.find('div',class_='bd').find('div').find_all('span')
star,score=data[0]['class'][0],data[1].get_text()      #这样star就是一整个字符

 爬取动态加载的网页

我们来试着爬取杭州今年5个月的天气数据(最近都是下雨,有点不喜欢哦,小小的毛毛细雨我觉得还好,但是大暴雨真是什么都不方便)

我们选择不同的月份,可以发现网页的url都没有发生改变,说明这个网页不是静态网页,它是后台异步加载的动态网页,我们表面不能知道它实际的链接的,那么我们需要抓包来进行分析。

右键,点击“检查”,点击“网络”

不要直接点击“重新加载页面”,那会加载大量页面弹出来一大堆。我们再次查询一个月份信息,发现后台会发送一个请求“GetHistoty……”(或者点击Fecth/XHR这是发送异步请求的意思,里面就是我们要抓的包)

 点击“请求”进去看一下,可以发现“请求URL”与网页上方的url不是同一个,这个就是异步加载的,请求方式为“GET”。复制URL“?”前面的部分(后面是参数部分,都在负载里)为url

复制“请求标头”里的User-Agent,设置为headers用于反爬

这个网站的反爬做的有点好啊,还需要设置headers的Referer属性 ,也在请求标头里面,复制下来

 点击“负载”,前两项是杭州地区有关的编码,都是不会变的,下面两项就是查询的year与month。复制里面的内容为请求的参数(设为字典类型)

点击“响应”,看一下返回的结果是怎样的

可以看到响应是json类型的数据(JSON (JavaScript Object Notation)数据由键值对组成,类似于字典,是一种轻量级的数据交换格式) 

点击“预览”,可以看到格式化的展示,将鼠标移到data的值可以看到html的数据(截图没法展示,自行看),可以发现里面有个<table>标签 

“响应”里也能看到,不过“预览”可视化更好 

表格数据用pandas可以很容易地解析 

import requests
import pandas as pd
from io import StringIO
url='https://tianqi.2345.com/Pc/GetHistory'
headers={"User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0','Referer':'https://tianqi.2345.com/wea_history/58457.htm'}
params={
"areaInfo[areaId]":58457,
"areaInfo[areaType]":2,
"date[year]":2025,
"date[month]":4
}
r=requests.get(url,headers=headers,params=params)     #请求头和参数都为字典类型
if r.status_code!=200:raise Exception('error')
data=r.json()["data"]         #r.json()方法会将返回的JSON格式的响应解析为一个Python对象(一般为字典/列表),我们取出‘data’键的值(是字符串)
data=StringIO(data)           #使用StringIO对象来包装HTML字符串,可以将字符串视为文件来读取
df=pd.read_html(data)[0]      #pd.read_html()方法可以解析一个网页中所有的表格,返回一个列表,里面的元素是DataFrame的数据结构
print(df)

这样我们单个的网页就爬取成功了,输出如下

 我们现在来爬取1-5月的数据,根据前面的分析,只需要将参数改一下就可以了

import requests
import pandas as pd
from io import StringIO
url='https://tianqi.2345.com/Pc/GetHistory'
headers={"User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 Edg/136.0.0.0','Referer':'https://tianqi.2345.com/wea_history/58457.htm'}
def craw_weather(month):params={"areaInfo[areaId]":58457,"areaInfo[areaType]":2,"date[year]":2025,"date[month]":month}r=requests.get(url,headers=headers,params=params)     if r.status_code!=200:raise Exception('error')data=r.json()["data"]data=StringIO(data)          df=pd.read_html(data)[0]      return df
lst=[]                #里面是每个月的df数据
for n in range(1,6):df=craw_weather(n)lst.append(df)
datas=pd.concat(lst)        #pd.concat()方法用于将多个Pandas对象(DataFrame或Series)沿着特定轴连接起来,非常灵活,可以用于行连接、列连接等多种操作
datas.to_excel('杭州1-5月天气数据.xlsx',index=False) #Pandas在将df保存为Excel时,会将df的索引作为单独的一列写入文件,设置index=False可以不包含索引列

展示如下,昨天的数据都有了

批量爬取正本小说

整本小说稍微有点多了,我们就拿番茄小说的top1为例吧,爬取前10章的内容,先批量爬取每一章的链接和章节名称,再根据链接爬取正文,最后将文章写到文件中去

网页地址为十日终焉完整版在线免费阅读_十日终焉小说_番茄小说官网

直接检索元素哈,可以发现所有章节都在特定的<div>标签下

文章内容也在特定<div>标签下

代码如下

import requests
from bs4 import BeautifulSoup
def get_urls():root_url='https://fanqienovel.com/page/7143038691944959011'r=requests.get(root_url)if r.status_code!=200:raise Exception('error')soup=BeautifulSoup(r.text,"html.parser")datas=[]n=0for chapter in soup.find('div',class_='chapter').find_all('a'):if n==10:breakdatas.append(['https://fanqienovel.com'+chapter['href'],chapter.get_text()])n+=1return datas
def get_chapter(url):r=requests.get(url)if r.status_code!=200:raise Exception('error')soup=BeautifulSoup(r.text,"html.parser")content=soup.find('div',"muye-reader-content noselect").get_text()return content
for urls in get_urls():url,title=urlswith open(f'{title}.txt','w',encoding='utf-8') as ch:      #写入文件ch.write(get_chapter(url))

展示如下

最后文章字符是乱码,因为网页源代码就是乱码的,查看<head>标签里的charset,编码就是‘utf-8’每错,主包也尝试了几种方法还是不能正常显示,可能浏览器可能会对显示的内容进行一些渲染或转换,我们讲到后面再来尝试

那爬这个有什么用呢? 有些盗版网站不是小广告很多嘛,那你就可以把文章爬下来看咯~

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

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

相关文章

Go语言实现生产者-消费者问题的多种方法

Go语言实现生产者-消费者问题的多种方法 生产者-消费者问题是并发编程中的经典问题&#xff0c;涉及多个生产者生成数据&#xff0c;多个消费者消费数据&#xff0c;二者通过缓冲区&#xff08;队列&#xff09;进行协调&#xff0c;保证数据的正确传递和同步。本文将从简单到…

【Opencv】canny边缘检测提取中心坐标

采用opencv 对图像中的小球通过canny边缘检测的方式进行提取坐标 本文介绍了如何使用OpenCV对图像中的小球进行Canny边缘检测&#xff0c;并通过Zernike矩进行亚像素边缘检测&#xff0c;最终拟合椭圆以获取小球的精确坐标。首先&#xff0c;图像被转换为灰度图并进行高斯平滑…

蓝桥杯12届国B 123

题目描述 小蓝发现了一个有趣的数列&#xff0c;这个数列的前几项如下&#xff1a; 1,1,2,1,2,3,1,2,3,4,⋯ 小蓝发现&#xff0c;这个数列前 1 项是整数 1&#xff0c;接下来 2 项是整数 1 至 2&#xff0c;接下来 3 项是整数 1 至 3&#xff0c;接下来 4 项是整数 1 至 4&…

鸿蒙OSUniApp 制作动态加载的瀑布流布局#三方框架 #Uniapp

使用 UniApp 制作动态加载的瀑布流布局 前言 最近在开发一个小程序项目时&#xff0c;遇到了需要实现瀑布流布局的需求。众所周知&#xff0c;瀑布流布局在展示不规则尺寸内容&#xff08;如图片、商品卡片等&#xff09;时非常美观和实用。但在实际开发过程中&#xff0c;我…

ThinkStation图形工作站进入BIOS方法

首先视频线需要接在独立显卡上&#xff0c;重新开机&#xff0c;持续按F1&#xff0c;或者显示器出来lenovo的logo的时候按F1&#xff0c;这样就进到bios里了。联*想*坑&#xff0c;戴尔贵。靠。

【源码级开发】Qwen3接入MCP,企业级智能体开发实战!

Qwen3接入MCP智能体开发实战&#xff08;上&#xff09; 一、MCP技术与Qwen3原生MCP能力介绍 1.智能体开发核心技术—MCP 1.1 Function calling技术回顾 如何快速开发一款智能体应用&#xff0c;最关键的技术难点就在于如何让大模型高效稳定的接入一些外部工具。而在MCP技术…

Linux下载与安装

一、YUM 1.1 什么是YUM 在CentOS系统中&#xff0c;软件管理方式通常有三种方式&#xff1a;rpm安装、yum安装以及编译&#xff08;源码&#xff09;安装。 编译安装&#xff0c;从过程上来讲比较麻烦&#xff0c;包需要用户自行下载&#xff0c;下载的是源码包&#xff0c;需…

PostgreSQL中的全页写

一、概述 在PGSQL数据库中&#xff0c;默认的页面大小为8KB&#xff0c;但是磁盘buffer的大小为4KB&#xff0c;扇区大小为512B。这就导致在操作系统的角度看数据库的写操作&#xff0c;其实并不是一种原子操作。如果操作系统发生了系统级别的故障&#xff0c;此时正好操作系统…

WEB安全--Java安全--shiro550反序列化漏洞

一、前言 什么是shiro&#xff1f; shiro是一个Apache的Java安全框架 它的作用是什么&#xff1f; Apache Shiro 是一个强大且灵活的 Java 安全框架&#xff0c;用于处理身份验证、授权、密码管理以及会话管理等功能 二、shiro550反序列化原理 1、用户首次登录并勾选记住密码…

2024 睿抗机器人开发者大赛CAIP-编程技能赛-专科组(国赛)解题报告 | 珂学家

前言 题解 2024 睿抗机器人开发者大赛CAIP-编程技能赛-专科组&#xff08;国赛&#xff09;&#xff0c;陈越姐姐出题。 国赛比省赛&#xff0c;难度增强了不少&#xff0c;题目就剩下4个题了。 涉及堆栈&#xff0c;hash表&#xff0c;优先队列等高阶数据结构的使用&#x…

15 C 语言字符类型详解:转义字符、格式化输出、字符类型本质、ASCII 码编程实战、最值宏汇总

1 字符类型概述 在 C 语言中&#xff0c;字符类型 char 用于表示单个字符&#xff0c;例如一个数字、一个字母或一个符号。 char 类型的字面量是用单引号括起来的单个字符&#xff0c;例如 A、5 或 #。 当需要表示多个字符组成的序列时&#xff0c;就涉及到了字符串。在 C 语言…

操作系统-锁/内存/中断/IO

文章目录 锁自旋锁互斥锁悲观锁和乐观锁 内存管理物理/虚拟内存页表段表虚拟内存布局写时复制copy on writebrk&#xff0c;mmap页面置换算法 中断中断分类中断流程 网络I/OI/O模型服务器处理并发请求 锁 自旋锁 自旋锁是一种基于忙等待&#xff08;Busy-Waiting&#xff09;…

割点与其例题

割点 定义&#xff1a; 若一个点在图中被去掉后&#xff0c;图的连通块个数增加&#xff0c;那么这个点就被称为“割点”。如下图所示红点。 定义说白了就是若去掉一个点&#xff0c;图被“断开”的点称为割点。 朴素算法&#xff1a; 枚举每个点 u。遍历图&#xff0c;如果…

图卷积神经网络(Graph Convolutional Network, GCN)

最近看论文看到了图卷积神经网络的内容&#xff0c;之前整理过图神经网络的内容&#xff0c;这里再补充一下&#xff0c;方便以后查阅。 图卷积神经网络&#xff08;Graph Convolutional Network, GCN&#xff09; 图卷积神经网络1. 什么是图卷积神经网络&#xff08;GCN&#…

安装win11硬盘分区MBR还是GPT_装win11系统分区及安装教程

最近有网友问我,装win11系统分区有什么要求装win11系统硬盘分区用mbr还是GPT&#xff1f;我们知道现在的引导模式有uefi和legacy两种引导模式&#xff0c;如果采用的是uefi引导模式&#xff0c;分区类型对应的就是gpt分区(guid)&#xff0c;如果引导模式采用的是legacy&#xf…

服务培训QDA 的安装调试方法,硬件模块的讲解和软件控制台使用及系统测试

#服务培训##质谱仪##软件控制##硬件模块# 以下是关于Waters QDa单杆液质质谱仪的安装调试、硬件模块讲解以及软件控制台使用培训的相关内容&#xff1a; 安装调试 场地准备&#xff1a;用户需要提前准备好实验室&#xff0c;确保实验室环境符合仪器的要求&#xff0c;如温度、…

在K8S集群中部署EFK日志收集

目录 引言环境准备安装自定义资源部署ElasticsearchMaster 节点与 Data 节点的区别生产优化建议安装好以后测试ES是否正常部署Fluentd测试filebeat是否正常推送日志部署Kibana获取账号密码&#xff0c;账号是&#xff1a;elastic集群测试 引言 系统版本为 Centos7.9内核版本为…

polarctf-web-[rce1]

考点&#xff1a; (1)RCE(exec函数) (2)空格绕过 (3)执行函数(exec函数) (4)闭合(ping命令闭合) 题目来源&#xff1a;Polarctf-web-[rce1] 解题&#xff1a; 这段代码实现了一个简单的 Ping 测试工具&#xff0c;用户可以通过表单提交一个 IP 地址&#xff0c;服务器会执…

【串流VR手势】Pico 4 Ultra Enterprise 在 SteamVR 企业串流中无法识别手势的问题排查与解决过程(Pico4UE串流手势问题)

写在前面的话 此前&#xff08;用Pico 4U&#xff09;接入了MRTK3&#xff0c;现项目落地需要部署&#xff0c;发现串流场景中&#xff0c;Pico4UE的企业串流无法正常识别手势。&#xff08;一体机方式部署使用无问题&#xff09; 花了半小时解决&#xff0c;怕忘&#xff0c;…

ES(Elasticsearch)的应用与代码示例

Elasticsearch应用与代码示例技术文章大纲 一、引言 Elasticsearch在现代化应用中的核心作用典型应用场景分析&#xff08;日志分析/全文检索/数据聚合&#xff09; 二、环境准备(前提条件) Elasticsearch 8.x集群部署要点IK中文分词插件配置指南Ingest Attachment插件安装…