【初识爬虫+requests模块】

爬虫又称网络蜘蛛、网络机器人。本质就是程序模拟人使用浏览器访问网站,并将需要的数据抓取下来。爬虫不仅能够使用在搜索引擎领域,在数据分析、商业领域都得到了大规模的应用。


URL

每一个URL指向一个资源,可以是一个html页面,一个css文档,一个js文件,一张图片等等。

URL的格式:protocol://hostname[:port]/path[?query]

protocol:网络传输协议

hostname:存放资源的服务器的域名或IP地址

port:是一个可选的整数,取值范围是0-65535。如果被省略了,默认http端口为80,https的端口是443。

path:路由地址,一般用来表示主机上的一个目录或文件地址,由零个或多个/符号隔开的字符串,路由地址决定了服务端如何处理这个请求。

query:从?开始到它们之间的部分就是参数,又称搜索部分或者查询字符串。


HTTP协议

HTTP(超文本传输协议)主要作用是让服务端和客户端之间进行数据交互(相互传输数据)。

HTTPS(安全超文本传输协议)是HTTP协议的安全版,对传输数据进行加密。

HTTP请求

请求类别:HTTP协议中定义了八种请求方法。主要了解两种:get和post请求。

get请求:从服务器获取数据下来,并不会对服务器资源产生任何影响的时候使用get请求。

post请求:向服务端发送数据(登录)、上传文件等,会对服务器资源产生影响时使用post请求。

请求头

User-Agent:请求载体的身份标识。在请求一个网页的时候,服务器通过这个参数就可以知道这个请求是由那种浏览器发送的。如果我们是通过爬虫发送请求,那么我们的User-Agent就是Python。不过对于有反爬虫机制的网站来说,这样就可以轻易的判断这个请求时爬虫。因此,我们要设置这个值为一些浏览器的值,来伪装我们的爬虫。

Cookie:对应的是一个用户的信息,http协议是无状态的。也就是同一个人发送了两次请求,服务器没有能力知道这两个请求是否来自同一个人,因此这时候就用cookie来做标识。

请求体:提交的内容

HTTP响应

响应行:反馈基本的响应情况

常见的响应状态码:

200:请求正常,服务器正常的返回数据

302:临时重定向。比如在访问一个需要登录的页面的时,而此时没有登录,就会重定向到登陆页面。

400:请求的url在服务器上找不到。换句话说就是请求url错误。

403:服务器拒绝访问,权限不够。

500:服务器内部错误。

响应头:对响应内容的描述。

Content-Length:服务器通过这个头,告诉浏览器回送数据的长度。

Content-Type: 服务器通过这个头,告诉浏览器回送数据的类型。


编写爬虫的基础流程

1.确定你要获取的数据,确定需要爬取的URL地址。

        网页上数据有的是通过js动态加载出来的。使用Ajax。

2.使用请求模块向URL地址发出请求,并得到响应内容。

        通过代码去发送请求

3.从响应内容中提取所需数据。

4.存储

在python的html后缀名下的文件内中写:

<script>let xhr = new XMLHttpRequest()xhr.open('GET', 'http://yu.ming(全是数字的那一串)/curl/getIp')//发送请求xhr.send()xhr.onload = function(){//jsonlet data = JSON.parse(xhr.reponse)let span1 = document.createElement('span')let span2 = document.createElement('span')span1.innerHTML = 'ip:' + data.returnCitySN.ip + '<br>'span2.innerHTML = '地址' + data.returnCitySN.Country + '<br>'document.body.appendChild(span1)document.body.appendChild(span2)}
</script>

requests模块

在cmd窗口下pip install requests来导入第三方模块,或者在pycharm内file的setting下Python Interpreter内进行下载。

requests模块的使用

1.requests.get():表示向网站发送GET请求,获取页面响应对象。

语法:

response=requests.get(url,headers=headers,params)

url:要抓取的url地址

headers:用于包装请求头信息

params:请求时携带的查询字符串参数

2.HttpResponse响应对象:我们使用requests模块向一个URL发起请求后会返回这样的对象。

响应对象属性:

text:获取相应内容字符串类型

content:获取响应内容bytes类型(抓取图片、音频、视频文件)

encoding:查看或指定响应字符编码

request.headers:查看响应对应的请求头

cookies:获取响应的cookie,经过set-cookie动作,返回coookieJar类型

json():将json字符串类型的响应内容转换为python对象

import requests
url = 'https://www.maoyan.com/board/6?timeStamp=1707033337406&channelId=40011&index=7&signKey=05c5030979de1a94fc40756853de3ca4&sVersion=1&webdriver=false&offset=0'# 使用requests 帮我们发送一个get请求
response = requests.get(url)    # get函数内放置url参数,获取响应内容并用一个变量来接收
print(response.request.headers)   # 获取请求头
print(response.text)     # 获取响应内容(可能会被反爬虫阻拦获取不到。此时就需要伪装一下了)

3.发送带header的请求

import requests
url = 'https://www.jd.com/?cu=true&utm_source=baidu-pinzhuan&utm_medium=cpc&utm_campaign=t_288551095_baidupinzhuan&utm_term=0f3d30c8dba7459bb52f2eb5eba8ac7d_0_0210197b670445ddbba4fb6fe8baceb0'
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}
response = requests.get(url, headers=header)
print(response.text)
'''
正则的定义:按照一定的规则,在字符串里面匹配要找的内容
如何使用正则:导入re文件
'''
import re
# findall:找到所有满足条件的数据,得到一个列表  
re.findall()# . 匹配一个任意字符 除了换行
# re.S 使. 可以匹配到换行符   
re.findall('a.','aba\naa',re.S)# * 出现0次或多次   
re.findall('a*','aba\naa')# .*贪婪匹配(尽量多匹配)   
html = '<div></div>'  print(re.findall('<.*>',html))
# 得到结果:['<div></div>']# .*?非贪婪匹配(尽量少匹配) 
html = '<div></div>'  print(re.findall('<.*?>',html))
# 得到结果:['<div>', '</div>']# 把想要的东西加括号,提取出来
html = '<div>XX</div>'
print(re.findall('<div>(.*?)</div>', html))   # ['XX']

关于完整使用:

import requests
base_url = 'https://movie.douban.com/chart'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}def get_html(url):# 发送请求功能response = requests.get(url, headers=headers)return response.textdef parse_html(html):# 提取数据功能r_list = re.findall('<div class="pl2">.*?>\n(.*?)/.*?</a>.*?<span class="rating_nums">(.*?)</span>', html, re.S)return r_listdef save(data_list):# 存储数据功能for data in data_list:name = data[0].strip()  # 去除两边空格num = data[1]print(name, num)print('-'*30)html = get_html(base_url)
# print(html)
data_list = parse_html(html)
save(data_list)

结果:

怪物 8.6
------------------------------
荒野 5.7
------------------------------
涉过愤怒的海 7.2
------------------------------
枯叶 7.9
------------------------------
坠落的审判 8.5
------------------------------
爆裂点 5.7
------------------------------
再见,李可乐 6.3
------------------------------
杂种 8.2
------------------------------
刀尖 5.3
------------------------------
花月杀手 7.3
------------------------------

存储数据到mysql内

首先导入第三方模块pymysql

写法一:

import pymysql
# 导入模块
# 建立数据库的链接
db = pymysql.connect(host='127.0.0.1',port=3306,database='douban',user='root',password='123456',charset='utf8'
)# 创建数据库 create database douban;(终端要输入的,否则会报错)
# 创建游标对象  通过游标对象去操作
cur = db.cursor()
# 执行操作
sql = 'insert into movie_info(name, num) values("%s", "%f")' % ('怪物', 8.6)
cur.execute(sql)
db.commit()
'''
创建表的语法:
create table movie_info(
id int primary key auto_increment,
name varchar(20),
num float(5)
);
'''
# 关闭游标对象
cur.close()
# 关闭连接
db.close()

注意:

  1. 创建数据库和创建表的代码要在cmd的mysql内部进行。
  2. 在创建表之前先使用表:use douban;
  3. 小数记得用 %f 哦.

写法二:

全部写入进该表中:

import reimport requestsimport pymysql# 建立数据库的链接
db = pymysql.connect(host='127.0.0.1',port=3306,database='douban',user='root',password='123456',charset='utf8'
)cur = db.cursor()
sql = 'insert into movie_info(name, num) values("%s", "%s")'base_url = 'https://movie.douban.com/chart'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}def get_html(url):# 发送请求功能response = requests.get(url, headers=headers)return response.textdef parse_html(html):# 提取数据功能r_list = re.findall('<div class="pl2">.*?>\n(.*?)/.*?</a>.*?<span class="rating_nums">(.*?)</span>', html, re.S)return r_listdef save(data_list):# 存储数据功能for data in data_list:name = data[0].strip()  # 去除两边空格num = data[1]print(name, num)li = [name, num]cur.execute(sql, li)db.commit()print('-'*30)html = get_html(base_url)
# print(html)
data_list = parse_html(html)
save(data_list)
# 关闭游标对象
cur.close()
# 关闭连接
db.close()

注意:前面已经写入的内容要进行删除,不然会报错的(主键的唯一性)。

import reimport requestsimport pymysql# 建立数据库的链接
db = pymysql.connect(host='127.0.0.1',port=3306,database='douban',user='root',password='123456',charset='utf8'
)cur = db.cursor()
sql = 'insert into movie_info(name, num) values("%s", "%f")'base_url = 'https://movie.douban.com/top250?start={}&filter='  # {}切换页数
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}
def get_html(url):# 发送请求功能response = requests.get(url, headers=headers)return response.textdef parse_html(html):# 提取数据功能r_list = re.findall('<div class="pl2">.*?>\n(.*?)/.*?</a>.*?<span class="rating_nums">(.*?)</span>', html, re.S)save(r_list)def save(data_list):# 存储数据功能for data in data_list:name = data[0].strip()  # 去除两边空格num = data[1]print(name, num)li = [name, num]cur.execute(sql, li)db.commit()print('-'*30)# 对爬取的内容找规律
for start in range(0, 226, 25):url = base_url.format(start)print(url)html = get_html(url)parse_html(html)cur.close()
db.close()

使用json来提取数据

import requests
import jsonurl = 'https://spa1.scrape.center/api/movie/?limit=10&offset=0'
response = requests.get(url)json_data = response.json()   # 用json对象来进行接收
for data in json_data["results"]:print(data["name"])print(data["categories"])print('-'*30)

换页提取:

第一种方式:

import reimport requestsbase_url = 'https://www.maoyan.com/board/4?offset={}'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}def get_html(url):'''通过requests模块发送get请求:param url: 给那个url发送请求:return: html代码'''response = requests.get(url, headers=headers)print(response.url)return response.textdef parse_html(html):'''提取数据的函数:param html: 在那个代码中寻找'''r_list = re.findall('<div class="movie-item-info">.*?title="(.*?)".*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>', html, re.S)save(r_list)def save(data_list):for data in data_list:li = [data[0],data[1].split(':')[1].strip(),data[2].split(':')[1].strip(),]print(li)for offset in range(0, 91, 10):url = base_url.format(offset)html = get_html(url=url)parse_html(html)print('-'*100)

第二种方式:

import reimport requestsbase_url = 'https://www.maoyan.com/board/4'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
}params = {"offset": 0
}
def get_html(url):'''通过requests模块发送get请求:param url: 给那个url发送请求:return: html代码'''response = requests.get(url, headers=headers, params=params)print(response.url)return response.textdef parse_html(html):'''提取数据的函数:param html: 在那个代码中寻找'''r_list = re.findall('<div class="movie-item-info">.*?title="(.*?)".*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>', html, re.S)save(r_list)def save(data_list):for data in data_list:li = [data[0],data[1].split(':')[1].strip(),data[2].split(':')[1].strip(),]print(li)for offset in range(0, 91, 10):params['offset'] = offsethtml = get_html(url=base_url)parse_html(html)print('-'*100)

https://curlconverter.com/#

代码复制copy的代码可自动生成


爬取音乐

import requestsresponse = requests.get('https://音乐所在网址')
print("请求成功")
song_data = response.content
with open('疑心病.mp3', 'wb')as f:f.write(song_data)

会添加到pycharm内,拖拽到桌面上即可。

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

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

相关文章

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Span组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之Span组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、Span组件 鸿蒙&#xff08;HarmonyOS&#xff09;作为Text组件的子组件&#xff0…

【MySQL】:深入理解并掌握DML和DCL

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. DML1.1 添加数据1.2 修改数据1.3 删除数据 二. DCL2.1 管理用户2.2 权限控制…

RabbitMQ-1.介绍与安装

介绍与安装 1.RabbitMQ1.0.技术选型1.1.安装1.2.收发消息1.2.1.交换机1.2.2.队列1.2.3.绑定关系1.2.4.发送消息 1.2.数据隔离1.2.1.用户管理1.2.3.virtual host 1.RabbitMQ 1.0.技术选型 消息Broker&#xff0c;目前常见的实现方案就是消息队列&#xff08;MessageQueue&…

基于AST实现一键自动提取替换国际化文案

背景&#xff1a;在调研 formatjs/cli 使用&#xff08;使用 formatjs/cli 进行国际化文案自动提取 &#xff09;过程中&#xff0c;发现有以下需求formatjs/cli 无法满足&#xff1a; id 需要一定的语义化&#xff1b; defaultMessage和Id不能直接hash转换&#xff1b; 需要…

简化版SpringMVC

简化版SpringMVC web.xml xml version"1.0" encoding"UTF-8"?> <web-app version"2.5" xmlns"http://java.sun.com/xml/ns/javaee" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation&quo…

MySQL学习记录——칠 表操作

文章目录 1、了解2、创建和插入1、基本创建和插入2、插入并更新on duplicate3、插入并替换replace 3、Retrieve1、查询select2、条件查询where3、结果排序order by4、限制行数limit 4、更新Update5、删除delete6、去重7、聚合函数&#xff08;5个&#xff09;1、count2、sum3、…

第十六篇【传奇开心果系列】Python的OpenCV库技术点案例示例:图像质量评估

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例短博文系列博文目录前言一、图像质量评估方法和相关函数的介绍二、均方误差示例代码三、峰值信噪比示例代码四、结构相似性指数示例代码五、视频质量评估示例代码六、OpenCV均方根误差计算示例代码七、OpenC…

Vivado开发FPGA使用流程、教程 verilog(建立工程、编译文件到最终烧录的全流程)

目录 一、概述 二、工程创建 三、添加设计文件并编译 四、线上仿真 五、布局布线 六、生成比特流文件 七、烧录 一、概述 vivado开发FPGA流程分为创建工程、添加设计文件、编译、线上仿真、布局布线&#xff08;添加约束文件&#xff09;、生成比特流文件、烧录等步骤&a…

05 06 Verilog基础语法与应用讲解

05. 1. 位操作 计数器实验升级&#xff0c;设计8个LED灯以每个0.5s的速率循环闪烁&#xff08;跑马灯&#xff09; 1.1 方法1&#xff1a;使用移位操作符<<来控制led灯的循环亮灭 设计代码 Verilog中&#xff0c;判断操作的时候不加位宽限定是可以的&#xff0c;比如i…

MySQL之体系结构

华子目录 MySQL简介MySQL的特性MySQL版本MySQL常见版本 数据库排名网站MySQL结构体系查看最大连接数查询缓存配置情况 一条SQL语句执行流程 MySQL简介 MySQL是一个小型关系数据库管理系统&#xff0c;开发者为瑞典MySQL AB公司。在2008年1月16号被sun公司10亿美金收购。2009年…

IntelliJ IDE 插件开发 | (六)内部模式的使用

系列文章 IntelliJ IDE 插件开发 |&#xff08;一&#xff09;快速入门IntelliJ IDE 插件开发 |&#xff08;二&#xff09;UI 界面与数据持久化IntelliJ IDE 插件开发 |&#xff08;三&#xff09;消息通知与事件监听IntelliJ IDE 插件开发 |&#xff08;四&#xff09;来查收…

Oracle systemstate、gdb、dbx介绍

当数据库出现严重的性能问题或者hang了的时候&#xff0c; 可能最常用的办法就是重启数据库&#xff0c;简单有效解决问题&#xff1b;但是重启后如何追踪问题的根本原因成了难题&#xff0c;很多信息随着重启也消失不见了&#xff0c;让追查问题变的十分棘手&#xff0c;这时就…

Spring第二天

一、第三方资源配置管理 说明&#xff1a;以管理DataSource连接池对象为例讲解第三方资源配置管理 1 管理DataSource连接池对象 问题导入 配置数据库连接参数时&#xff0c;注入驱动类名是用driverClassName还是driver&#xff1f; 1.1 管理Druid连接池【重点】 数据库准备…

Android 识别车牌信息

打开我们心爱的Android Studio 导入需要的资源 gradle //开源车牌识别安卓SDK库implementation("com.github.HyperInspire:hyperlpr3-android-sdk:1.0.3")button.setOnClickListener(v -> {Log.d("Test", "");try (InputStream file getAs…

#Z0458. 树的中心2

题目 代码 #include <bits/stdc.h> using namespace std; struct ff {int z,len; }; vector<ff> vec[300001]; int n,u,v,w,dp[300001][2],ans 1e9; void dfs(int x,int fa) {for(int i 0;i < vec[x].size();i){ff son vec[x][i];if(son.z ! fa){dfs(son.z,…

搭建macOS开发环境-1:准备工作

请记住&#xff1a; 最重要的准备工作永远是&#xff1a;备份数据 !!! 通过图形界面检查 Mac 的 CPU 类型&#xff1a; 在搭载 Apple 芯片的 Mac 电脑上&#xff0c;“关于本机”会显示一个标有“芯片”的项目并跟有相应芯片的名称&#xff1a; 通过命令行检查Mac的CPU类型 …

ASP.NET Core 预防开放式重定向攻击

写在前面 为预防钓鱼网站的常用套路&#xff0c;在进行 Web 应用程序的开发时&#xff0c;原则上应该将所有由用户提交的数据视为不可信。如果应用程序中包含了基于 URL 内容重定向的功能&#xff0c;需要确保这种类型的重定向操作只能在应用本地完成&#xff0c;或者明确判断…

构造回文数组

目录 原题描述&#xff1a; 题目描述 时间&#xff1a;1s 空间&#xff1a;256M 题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 样例1输入&#xff1a; 样例1输出&#xff1a; 样例2输入&#xff1a; 样例2输出&#xff1a; 约定&#xff1a; 作…

《幻兽帕鲁》攻略:0基础入门及游戏基础操作 幻兽帕鲁基础设施 幻兽帕鲁基础攻击力 Mac苹果电脑玩幻兽帕鲁 幻兽帕鲁加班加点

今天就跟大家聊聊《幻兽帕鲁》攻略&#xff1a;0基础入门及游戏基础操作。 如果想在苹果电脑玩《幻兽帕鲁》记得安装CrossOver哦。 以下纯干货&#xff1a; CrossOver正版安装包&#xff08;免费试用&#xff09;&#xff1a;https://souurl.cn/Y1gDao 一、基础操作 二、界面…

(45)执行操作后的变量值

文章目录 每日一言题目解题思路代码结语 每日一言 与其临渊羡鱼&#xff0c;不如退而结网。——《史记汉书董仲舒传》 题目 题目链接&#xff1a;执行操作后的变量值 存在一种仅支持 4 种操作和 1 个变量 X 的编程语言&#xff1a; X 和 X 使变量 X 的值 加 1 –X 和 X-- 使…