python爬虫request和BeautifulSoup使用

news2024/11/24 1:23:39

request使用

1.安装request

pip install request

image-20231028221900255

2.引入库

import requests

3.编写代码

发送请求

我们通过以下代码可以打开豆瓣top250的网站

response = requests.get(f"https://movie.douban.com/top250"

但因为该网站加入了反爬机制,所以我们需要在我们的请求报文的头部加入User-Agent的信息

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

response = requests.get(f"https://movie.douban.com/top250",headers=headers)

User-Agent可以通过访问网站时按f12查看获取

image-20231028222657590

我们可以通过response的ok属性判断是否请求成功

import requests
headers ={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}

response = requests.get(f"https://movie.douban.com/top250",headers=headers)
if response.ok:
    print("请求成功!")
else:
    print("请求失败!")

此时如果请求成功,控制台就会打印请求成功!

image-20231028222826786

获取网页的html

我们可以通过response的text的属性来获取网页的html

import requests
headers ={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}

response = requests.get(f"https://movie.douban.com/top250",headers=headers)
if response.ok:
    html = response.text
    print(html)
else:
    print("请求失败!")

此时请求成功就会打印页面的html了

image-20231028223025357

BeautifulSoup使用

Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下:

Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。

Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。

简单的说,我们可以拿他来解析html页面,来获取html的元素

1.安装BeautifulSoup

要使用BeautifulSoup4需要先安装lxml,再安装bs4

pip install bs4
pip install bs4

image-20231028223709504

2.引入库

from bs4 import BeautifulSoup

3.编写代码

获取元素

我们通过BeautifulSoup()就可以得到解析后的soup对象

    soup = BeautifulSoup(html, "html.parser")

使用findAll函数就可以找到我们想要的元素,例如:我们想找到span标签中,class为title的元素

   all_titls = soup.findAll("span", attrs={"class": "title"})

此时我们代码如下

from bs4 import BeautifulSoup
import requests
headers ={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}

response = requests.get(f"https://movie.douban.com/top250",headers=headers)
if response.ok:
    html = response.text
    soup = BeautifulSoup(html, "html.parser")
    all_titls = soup.findAll("span", attrs={"class": "title"})
    print(all_titls)
else:
    print("请求失败!")

运行结果image-20231028224135059

元素处理

我们虽然找到了span标签中,class为title的元素,但我们不需要span标签中的内容,所以我们需要对他进行处理

首先我们发现,all_titls其实是一个数组,所以我们可以遍历他,这样就可以得到每一个span元素,通过string的属性就可以得到span标签中间的内容

from bs4 import BeautifulSoup
import requests
headers ={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}

response = requests.get(f"https://movie.douban.com/top250",headers=headers)
if response.ok:
    html = response.text
    soup = BeautifulSoup(html, "html.parser")
    all_titls = soup.findAll("span", attrs={"class": "title"})
    for title in all_titls:
        title_string = title.string
        print(title_string)
else:
    print("请求失败!")

此时我们发现,我们虽然得到span标签中间的内容,但其中含有电影名字的英文名这是我们不需要的

image-20231028224526419

通过观察我们发现,每个英文名前都是带有/的,所以我们可以判断其是否含有"/"来进行过滤

from bs4 import BeautifulSoup
import requests
headers ={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}

response = requests.get(f"https://movie.douban.com/top250",headers=headers)
if response.ok:
    html = response.text
    soup = BeautifulSoup(html, "html.parser")
    all_titls = soup.findAll("span", attrs={"class": "title"})
    for title in all_titls:
        title_string = title.string
        if "/" not in title_string:
            print(title_string)
else:
    print("请求失败!")

image-20231028224813650

整合

虽然此时我们打印出了我们想要的数据,但这只是其中一页的,且只是打印,并没有存入数据库或者某个文件里

打印所有页

通过观察第二页的路径,我们发现在点击第二页时系统会传一个start的属性,这个属性除以25在加1就是我们需要的页数,反过来就是 (页数-1)*25 = start

image-20231028224946341

所以我们可以通过for循环,依次传入0,25,50…

from bs4 import BeautifulSoup
import requests
headers ={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}

for start_num in range(0,250,25):
    response = requests.get(f"https://movie.douban.com/top250?start={start_num}",headers=headers)
    if response.ok:
        html = response.text
        soup = BeautifulSoup(html,"html.parser")
        all_titls = soup.findAll("span",attrs={"class":"title"})
        for title in all_titls:
            title_string = title.string
            if "/" not in title_string:
                print(title_string)
    else:
        print("请求失败!")

这样我们就得到了所有的电影名

image-20231028225342725

存入txt

这里我们演示将数据存入记事本中,我们定义个数组,将所有电影的名字存入该数组,最后遍历数组写入txt文件即可

from bs4 import BeautifulSoup
import requests
headers ={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36"
}
titles = []
for start_num in range(0,250,25):
    response = requests.get(f"https://movie.douban.com/top250?start={start_num}",headers=headers)
    if response.ok:
        html = response.text
        soup = BeautifulSoup(html,"html.parser")
        all_titls = soup.findAll("span",attrs={"class":"title"})
        for title in all_titls:
            title_string = title.string
            if "/" not in title_string:
                titles.append(title_string)
    else:
        print("请求失败!")
with open(r'豆瓣top250.txt', 'w') as f:
    for i in titles:
        f.write(i + '\n')

image-20231028225627360

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

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

相关文章

Python---练习:有一物,不知其数,三三数之余二,五五数之余三,七七数之余二,问物几何?

案例: 有一物,不知其数,三三数之余二,五五数之余三,七七数之余二,问物几何? 人话: 有一个数字,不知道具体是多少,用3去除剩2,用5去除剩3&#…

Vue 3.3.6 ,得益于WeakMap,比之前更快了

追忆往昔,穿越前朝,CSS也是当年前端三剑客之一,风光的很,随着前端跳跃式的变革,CSS在现代前端开发中似乎有点默默无闻起来。 不得不说当看到UnoCss之前,我甚至都还没听过原子化CSS[1]这个概念(…

业界中说的快速原型法是什么

快速原型法是一种软件开发过程,其核心思想是在开发初期快速构建一个系统的原型,即一个工作模型,以便用户和开发者能够更好地理解系统的需求和功能。这种方法强调快速迭代和用户参与,目的是更早地发现和修正问题,从而提…

微软:Octo Tempest是最危险的金融黑客组织之一

导语 最近,微软发布了一份关于金融黑客组织Octo Tempest的详细报告。这个组织以其高级社交工程能力而闻名,专门针对从事数据勒索和勒索软件攻击的企业。Octo Tempest的攻击手段不断演变,目标范围也不断扩大,成为了电缆电信、电子邮…

回流重绘零负担,网页加载快如闪电

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、回…

椭圆曲线点加的应用计算

一、点加应用 1.1 背景 假设一条椭圆曲线方程为 y^2 =x^3+ax+b确定这条椭圆曲线方程参数是p,a,b,G,n,h,除了参数a,b ,其他参数的意义 p为质数,(mod p)运算G为基点n为点G的阶h是椭圆曲线上所有点的个数m与n相除的商的整数部分1.2 方程(y^2 =x^3+x+6,P=11) 椭圆曲线方程y…

原始流,缓冲流性能比较

一.低级字节流一个一个字节复制 1.代码 package org.example;import java.io.*;public class day13 {//原视频路径private static final String file1 "D:\\temp\\day05\\改名.mp4";//目的视频路径private static final String file2 "D:\\temp\\day05\\不改…

消息队列中间件面试笔记总结RabbitMQ,Kafka,RocketMQ

文章目录 (一) Rabbit MQRabbitMQ 核心概念消息队列的作用Exchange(交换器)Broker(消息中间件的服务节点)如何保证消息的可靠性如何保证 RabbitMQ 消息的顺序性如何保证 RabbitMQ 高可用的?如何解决消息队列的延时以及过期失效问题消息堆积问…

服务运营 |论文解读: 住院病人“溢出”:一种近似动态规划方法

摘要 在住院床位管理中,医院通常会将住院病人分配到相对应的专科病房,但随着病人的入院和出院,可能会出现病人所需的专科病房满员,而其他病房却有空余床位的情况。于是就有了 "溢出 "策略,即当病人等候时间…

温湿度计传感器DHT11控制数码管显示verilog代码及视频

名称:温湿度计传感器DHT11控制数码管显示 软件:QuartusII 语言:Verilog 代码功能: 使用温湿度传感器DHT11采集环境的温度和湿度,并在数码管显示 本代码已在开发板验证 开发板资料: 大西瓜第一代FPGA升级…

leetCode 229. 多数元素 II + 摩尔投票法 + 进阶 + 优化空间

229. 多数元素 II - 力扣(LeetCode) 给定一个大小为 n 的整数数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1)的算法解决此问题。 (1)哈希表 class …

Android-宝宝相册(第四次作业)

第四次作业-宝宝相册 题目 用Listview建立宝宝相册,相册内容及图片可自行设定,也可在资料文件中获取。给出模拟器仿真界面及代码截图。 (参考例4-8) 创建工程项目 创建名为baby的项目工程,最后的工程目录结构如下图所…

Linux 基本语句_8_C语言_文件控制

为了解决多个进程同时操作一个文件,产生一些情况,通常对文件进行上锁,已解决对共享文件的竞争 对打开文件进行各种操作: int fcentl(int fd, int cmd, .../*arg*/如果cmd与锁操作有关,那么fcentl函数的第三个参数就要…

从Mysql架构看一条查询sql的执行过程

1. 通信协议 我们的程序或者工具要操作数据库,第一步要做什么事情? 跟数据库建立连接。 首先,MySQL必须要运行一个服务,监听默认的3306端口。在我们开发系统跟第三方对接的时候,必须要弄清楚的有两件事。 第一个就是通…

38基于matlab的期货预测,利用PSO优化SVM和未优化的SVM进行对比,得到实际输出和期望输出结果。

基于matlab的期货预测,利用PSO优化SVM和未优化的SVM进行对比,得到实际输出和期望输出结果。线性核函数、多项式、RBF核函数三种核函数任意可选,并给出均方根误差,相对误差等结果,程序已调通,可直接运行。 3…

哈希算法:哈希算法在分布式系统中有哪些应用?

文章来源于极客时间前google工程师−王争专栏。 哈希算法除了上篇的四个应用(安全加密、数据校验、唯一标识、散列函数),还有三种应用:负载均衡、数据分片、分布式存储。 这三个应用都跟分布式系统有关。哈希算法是如何解决这些分…

Nginx的进程结构实例演示

可以参考《Ubuntu 20.04使用源码安装nginx 1.14.0》安装nginx 1.14.0。 nginx.conf文件中worker_processes 2;这条语句表明启动两个worker进程。 sudo /nginx/sbin/nginx -c /nginx/conf/nginx.conf开启nginx。 ps -ef | grep nginx看一下进程情况。 sudo /nginx/sbin/ng…

Java8与JDK1.8与JDK8之间的关系是什么?

1.Java8等价于JDK8 2.JDK8或者JDK1.8是由于自从JDK1.5/JDK5命名方式改变后遗留的历史问题。所以JDK8或者JDK1.8是等价的。 2004年9月30日,J2SE1.5发布。为了表示该版本的重要性,J2SE 1.5更名为Java SE 5.0,从此开始,如下图像jav…

Go学习第十四章——Gin请求与响应

Go web框架——Gin请求与响应 1 响应1.1 String1.2 JSON(*)1.3 HTML(*)1.4 XML1.5 文件(*) 2 请求2.1 请求参数查询参数 (Query)动态参数 (Param)表单参数 (PostForm)原始参数 (GetRawData) 2.2 请求头2.3 …

JAVA:集合框架常见的面试题和答案

1、List接口的常见实现类有哪些? 答: 常见的List接口实现类包括: ArrayList: 基于动态数组实现的List,支持快速随机访问。LinkedList: 基于链表实现的List,支持快速的插入和删除操作。Vector: 一个线程安全的动态数组…