文章目录
在当今信息爆炸的数字时代,数据的获取和处理变得日益重要。本篇博客旨在为读者提供一扇窗口,透过它可以看到爬虫技术的神奇世界。从数据采集的基础知识到高级应用,我们将揭示爬虫如何使数据获取变得简单、高效,并且功能强大。无论您是初学者还是在寻求深化理解,都可以在这里找到您所需要的知识。让我们一起开始这趟知识之旅,解锁爬虫给我们的日常生活和工作带来的无限可能。
一、什么是爬虫
使用编程方式自动化采集数据的过程称为爬虫
爬虫是使用程序自动化发送请求、获取响应的程序,
主要用来批量抓取(采集)文件或数据
二、使用爬虫可以做什么?
数据采集:爬虫可以用来采集网站的各种信息,比如新闻文章、图片资料、产品价格、用户评论等。这种数据经常用于商业分析或学术研究。
网页数据提取:Python 爬虫可以从复杂的网页源码中提取所需的数据,例如可从电子商务网站抓取产品信息,从社交网络网站抓取用户行为。
竞品分析:通过自动化的方式抓取竞争对手的信息,如价格、优惠策略、产品变动等,可以进行实时的竞品分析和调整自己的商业策略。
自动登录和操作:Python 爬虫也可以实现自动登录网站,进行一些自动化操作,如自动发帖、自动评论、自动点赞、自动抢等。
搜索引擎爬取:搜索引擎(如 Google、百度)的工作原理也是基于爬虫的,爬过互联网并将网页信息存储到索引数据库中。
数据清洗:爬虫获取的数据通常需要清洗和处理才能用于分析。Python 有很多数据清洗的库可以将爬取的原始数据转化为易于处理的格式。
机器学习和数据挖掘:爬虫获取的数据经常用作机器学习算法的训练集或用于数据挖掘,以发现数据中隐藏的模式。
三、前置知识
基本网络知识
简单流程:打开浏览器-输入网址-看到网页
详细流程:打开浏览器-输入网址并确认-到达服务器-服务器返回源代码-浏览器显示
API接口
应用程序编程接口(英语:Application Programming Interface,简称:API),是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
环境安装
c
pip install requests
四、Requests库
如果你已经安装了requests库,那么你可以直接用Python导入它:
c
import requests
发送GET请求
GET请求通常用于获取服务器的资源。你可以通过requests.get(url)函数发送GET请求。例如:
c
response = requests.get('http://httpbin.org/get') # 此处URL需替换为实际可用的URL
通过response对象,我们可以获取很多信息,如状态码、响应头、响应的html文本等。
c
print(response.status_code) # 输出状态码
print(response.headers) # 输出响应头
print(response.text) # 输出html文本
发送POST请求
POST请求通常用于向服务器提交数据。你可以通过requests.post(url, data)函数发送POST请求。
相比于GET请求可以隐藏个人信息
c
data = {'key1': 'value1', 'key2': 'value2'}
response = requests.post('http://httpbin.org/post', data=data) # 此处URL需替换为实际可用的URL
同样,你可以通过response对象获取响应信息。
c
print(response.status_code) # 输出状态码
print(response.text) # 输出返回的信息
添加请求头
有些网站会检查请求的Headers,因此我们需要通过requests.get(url, headers=headers)或requests.post(url, data, headers=headers)函数发送带请求头的请求。
c
headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get('http://httpbin.org/get', headers=headers) # 此处URL需替换为实际可用的URL
拓展内容
HTTP 状态码由三位数和一个原因短语组成,如果收到的响应中没有包含预期的内容,这些状态码可以帮助确定出现问题的原因和位置。下面是一些最常见的HTTP状态码:
c
1xx(信息响应):这类状态码代表请求已被接受,需要进一步处理。这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束。
100 Continue:服务器已收到请求的一部分,客户端应该继续发送其余的请求。
2xx (成功) :这类状态码表明服务器成功地接受了由客户端发出的请求
200 OK: 请求成功。请求所希望的回应头或数据体将随此响应返回。
201 Created: 请求已被实现,并且有一个新的资源已经依据请求的需要而创建。
3xx (重定向):完成请求所需额外的步骤。
302 Found:请求的资源现在临时从不同的URI响应请求。
304 Not Modified:资源未改变,直接使用浏览器缓存即可。
4xx(请求错误):这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理。
400 Bad Request:请求无法被服务器理解。
401 Unauthorized:当前请求需要用户验证。
403 Forbidden:服务器了解客户端的请求,但是拒绝执行它。
404 Not Found:请求失败,请求所希望得到的资源未被在服务器上发现。
5xx(服务器错误):这类状态码代表服务器在处理请求的过程中发生了错误。
500 Internal Server Error:服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。
502 Bad Gateway:服务器是一个网关或者代理服务器,它收到了来自上游服务器的无效响应。
503 Service Unavailable:由于临时的服务器维护或者过载,服务器当前无法处理请求。
五、常用属性
c
# status_code:获取HTTP响应的状态码
print(response.status_code)
# headers:HTTP响应的头信息,返回的是一个字典
print(response.headers)
# text:HTTP响应的主体内容,此属性会自动对结果进行解码(一般用于文档爬取)
print(response.text)
# content:HTTP响应的二进制内容(一般用非文档爬取,例如:图片,视频)
print(response.content)
json():如果HTTP响应的内容是json,我们可以使用此方法解析json,返回一个字典。
print(response.json())
# cookies:一个CookieJar对象,包含服务器设置的所有cookies
print(response.cookies)
# url:URL of the response
print(response.url)
# encoding:获取响应的编码方式
print(response.encoding)
六、单图下载器案例
这里以爬取百度图标为例:
c
#爬取流程
#1.导库
import requests #网络请求库
#2.寻址
url = "https://pss.bdstatic.com/static/superman/img/logo/bd_logo1-66368c33f8.png"
#3.请求
res = requests.get(url)
#4.处理
with open("image.png","wb") as file:
file.write(res.content)
可知找到图标的地址就可以爬取信息
寻址步骤如下:
1.打开想要爬取信息的网站
2.点击键盘上的"F12",开启开发者模式
3.按如图步骤点击就可以获取想要的信息地址,如此便寻址成功
七、通过API查询想要的信息案例
前面我们已经讲过API接口的作用,下面我们以天气API为例演示爬取过程
c
#http://tianqiapi.com/index
#导库
import requests
#寻址,api接口url
url = "http://v1.yiketianqi.com/api?appid=52337255&appsecret=D6sbQoqu&city="
while True:
print("欢迎使用1.0版本天气预报系统!")
x = input("请输入你要查询的城市:")
#请求
res = requests.get(url+x)
# print(res.text) #返回了unicode编码
#把网页的字典列表(json)转化为python的字典和列表,使用.json()方法
res2 = res.json()
#索引数据得到想要的内容
city = res2["city"]
temp1 = res2["data"]
temp2 = temp1[0]
humidity = temp2["humidity"]
week = temp2["week"]
wea = temp2["wea"]
print("您的城市:"+city)
print(week)
print("天气是"+wea)
print("湿度",humidity)
#有反爬措施
import requests
url="http://www.baidu.com"
h = {'User-Agent': 'Mozilla/5.0'}
res=requests.get(url,headers=h)
print(res.text)
读出结果