Python | 爬虫

news/2025/2/15 9:02:10/

 

个人简介:本科大二学生,在CSDN上分享自己日常学习到的知识并记录

分类专栏:Python从入门到精通

目录

一、Python爬虫介绍

1.1 什么是爬虫

1.2 爬虫可以做什么

1.3 爬虫的本质

1.4 爬虫的基本流程

二、爬虫准备工作

2.1 浏览器请求与响应

2.2 main方法

2.3 模块、包和库

三、爬取网页

3.1 发送get请求

 3.2 发送POST请求

3.3 超时处理

3.4 模拟浏览器获取数据


一、Python爬虫介绍

1.1 什么是爬虫

网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本

由于互联网数据的多样性和资源的有限性,

根据用户需求定向抓取网页并分析已成为如今主流的爬取策略。

1.2 爬虫可以做什么

爬虫可以爬取网络上的数据,例如公司企业人物之间的关系,(天眼查);

爬虫可以爬取网络上的视频,例如电影电视剧评分介绍,(电影天堂)。

获取到的数据经过数据采集,数据清洗,数据聚合,数据建模

数据产品化为一体的大数据解决方案。

以前我们使用网络产生了大量的数据,现在有人将数据整理起来供人们使用,

就形成了大数据产品,这也就是大数据火起来的原因。

1.3 爬虫的本质

模拟浏览器打开网页,获取网页中我们想要的那部分数据。

 通过超链接 a标签,只要给定一个网页,

网页中含有超链接的话爬虫程序就可以不断的爬取数据。

 搜索引擎的原理图。

1.4 爬虫的基本流程

1.准备工作

通过浏览器查看并分析目标网页,学习编程基础规范.

2.获取数据

通过Http库向目标站点发起请求,请求可以包含额外的header等信息,

如果服务器能正常响应,

会得到一个Response,便是所要获取的页面内容。

3.解析内容

得到的内容可能是HTML、json格式,可以用页面解析库、正则表达式等解析。

4.保存数据

可以将数据保存为文本、保存到数据库、或者特定格式的文件。

二、爬虫准备工作

2.1 浏览器请求与响应

下面以请求某电影网的一个网页为例,

讲解浏览器请求服务器和服务器响应数据的过程。

 

 

2.2 main方法

Python中也有main()方法,main方法是函数执行的入口。

如果没有main方法,Python将自顶而下解释执行;

# 没有main方法def say():print("say ...")def get():print("get ...")say()
get()

如果有main方法,将以main方法为入口开始执行;

def say():print("say ...")def get():print("get ...")# 有main方法if __name__ == '__main__':get()

如果同时含有main方法和调用方法,将自顶而下执行;

def say():print("say ...")def get():print("get ...")say()# 同时含有main方法和调用方法if __name__ == '__main__':get()

因此,main方法的作用就是控制函数执行流程。

2.3 模块、包和库

模块是一种以.py为后缀的文件,在.py文件中定义了一些常量和函数,模块名称是文件名

模块的导入通过import来实现。

体现了模块的结构化管理思想,包一般由__init__.py文件和其他模块文件构成,

将众多具有相关功能的模块结构化组合在一起形成包。

没有具体的定义,着重强调功能性,具有某些功能的函数、模块和包都可以称为库。

# 引用模块from package1 import files1print(files1.add(2, 3))

引入模块的方式:

1.通过命令行引入

2.idea加载

import  bs4 # 网页解析、获取数据
import  re # 正则表达式、文字匹配(python内置)
import urllib.request,urllib.error #置顶url、获取网页数据(python内置)
import  xlwt # 进行excel操作
import  sqlite3 # 进行sqlite数据库操作(python内置)

三、爬取网页

3.1 发送get请求

下面以某度为例:

response = urllib.request.urlopen("HTTP://www.baidu.com")
# www.baidu.com 报错-ValueError: unknown url type: 'www.baidu.com'-要加HTTP/HTTPS
# utf-8解码得到网页源代码
print(response.read().decode("utf-8"))

得到的打印是整个html文档,即下面这个页面的源代码:

 3.2 发送POST请求

1.以这个链接为例:发送请求链接的网站(httpbin.org)

# 模拟表单数据并设置编码
form = bytes(urllib.parse.urlencode({"name":"xiao_guo",}),encoding="utf-8")
resp = urllib.request.urlopen("http://httpbin.org/post",form)
print(resp.read().decode("utf-8"))

得到的响应如下

{"args": {}, "data": "", "files": {}, "form": {"name": "xiao_guo"}, "headers": {"Accept-Encoding": "identity", "Content-Length": "13", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "Python-urllib/3.8", "X-Amzn-Trace-Id": "Root=1-63e0b6fa-1b4d392244fbc41d4f22f203"}, "json": null, "origin": "171.35.80.31", "url": "http://httpbin.org/post"
}

2.测试本地tomcat启动的Web服务

form = bytes(urllib.parse.urlencode({"name": "xiao_guo", }), encoding="utf-8")
resp = urllib.request.urlopen("http://localhost:8080/order/userPage", form)
print(resp.read().decode("utf-8"))
# 打印:{"code":0,"map":{},"msg":"NOTLOGIN"},因为请求中的浏览器没有相关登录信息

3.3 超时处理

try:response = urllib.request.urlopen("http://httpbin.org/get",timeout=0.01)# 报错:urllib.error.URLError: <urlopen error timed out>print(response.read().decode("utf-8"))
except urllib.error.URLError as e:print("Time Out! %s"%e)

3.4 模拟浏览器获取数据

1.模拟浏览器发送POST请求

# 缺少//,报错-urllib.error.URLError: <urlopen error no host given>
url = "http://httpbin.org/post"
# POST请求要求data是bytes,缺少bytes,报错-TypeError: POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.
form_data = bytes(urllib.parse.urlencode({"name": "XiaoGuo"
}),encoding="utf-8")
headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36 Edg/109.0.1518.78"
}
# 封装请求对象req
req = urllib.request.Request(url, form_data, headers, method="POST")
# 传递req发送请求
resp = urllib.request.urlopen(req)
print(resp.read().decode("utf-8"))

2.模拟浏览器发送GET请求

url = "https://www.douban.com"
headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36 Edg/109.0.1518.78"
}
req = urllib.request.Request(url=url, headers=headers)
resp = urllib.request.urlopen(req)
print(resp.read().decode("utf-8"))

 四、总结

下面是根据这篇文章内容封装的函数,用于获取网页数据.


# 2.获取网页数据
def ask_url(url):# 请求头headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Mobile Safari/537.36 Edg/109.0.1518.78"}# 创建请求对象requset = urllib.request.Request(url=url, headers=headers)# 结果对象htmlhtml = ""try:# 发送请求response = urllib.request.urlopen(requset)# 获取并解析请求html = response.read().decode("utf-8")print(html)except urllib.error.URLError as e:# 如果包含这个错误状态码属性if hasattr(e, "code"):print("status code :%s" % str(e.code))# 如果包含错误原因if hasattr(e, "reason"):print("error reason :%s" % str(e.reason))# 返回网页数据return html

本期的分享就到这里啦,我们下期再见,拜拜!


http://www.ppmy.cn/news/22682.html

相关文章

【python学习笔记】: 实用有趣的 高级脚本

1.使用 Python 进行速度测试 这个高级脚本帮助你使用 Python 测试你的 Internet 速度。只需安装速度测试模块并运行以下代码。 # pip install pyspeedtest # pip install speedtest # pip install speedtest-cli #method 1 import speedtest speedTest speedtest.Speedtest(…

数据库(一)

1.了解数据库的基本概念和发展史、数据库系统的特点、数据库系统的组成。 数据库的4个基本概念&#xff1a;   数据Data&#xff1a;数据库中存储的基本对象&#xff0c;描述事物的符号记录称为数据&#xff0c;数据的含义称为数据的语义&#xff0c;数据与其语义是不可分的。…

【MySQL】分库分表相关思考

一、分库分表概念 1. 分库 随着业务的增长&#xff0c;数据量的增加&#xff0c;很多接口响应时间变得很长&#xff0c;经常出现 Timeout&#xff0c;而且通过升级 MySQL 实例配置已经无法解决问题了&#xff0c;这时候就要分库。 垂直分库&#xff1a;将不同的业务表分在不同…

外贸业务员要具备哪些能力?

外贸业务员需要准备的能力如下。我希望它能帮助你一、我们应该了解产品性能和产品可能出现的问题&#xff0c;以便在未来的外贸谈判中准确回答客户提出的各种问题。例如&#xff0c;家纺销售人员“非常熟悉家用纺织品&#xff0c;包括窗帘、床上用品等”&#xff1b;高级针织销…

微信小程序API的Promise化及全局状态管理MobX

文章目录API的Promise化创建promise化的对象全局状态管理创建页面中绑定页面中使用组件中绑定组件中使用API的Promise化 默认情况下小程序官方提供的API都是基于回调函数实现的&#xff0c;例如 wx.request({method:,url:,data:{},success:()>{},fail: ()>{},complete:…

优思学院|月入一万以上是常态吗?质量人如何自我提升?

近日&#xff0c;“月入过万的人在中国属于什么水平”引发讨论。根据一些数据显示&#xff0c;放眼全国&#xff0c;月工资水平能達到1万的不是大家想象中的那么多。 不过&#xff0c;月薪一万元人民币在一些特定行业&#xff0c;如科技、金融和管理领域&#xff0c;又或者地点…

实验十二、静态工作点稳定电路频率响应的研究

一、题目 研究旁路电容和静态工作点分别对 QQQ 点稳定电路频率响应的影响。 二、仿真电路 仿真电路如图1所示。晶体管采用高频小信号晶体管 ZTX325&#xff08;该晶体管位于RF处&#xff09;。 (a)电路的低频特性(a)\,\,电路的低频特性(a)电路的低频特性(b)旁路电容Ce变化(b…

贝叶斯算法学习与记录第一弹

文章目录一、贝叶斯算法起源二、贝叶斯主要解决的问题三、为什么使用贝叶斯四、问题&#xff1a;五、贝叶斯公式&#xff1a;六、拼写纠正例子&#xff1a;七、模型比较理论八、垃圾邮件过滤实例一、贝叶斯算法起源 贝叶斯算法源于一个叫贝叶斯的人为了解决“逆概”问题而创作…