您好,欢迎来到五一七教育网。
搜索
您的当前位置:首页第019课:⽤Python获取⽹络数据

第019课:⽤Python获取⽹络数据

来源:五一七教育网
        对于Python 语⾔来说,⼀个较为擅⻓的领域就是⽹络数据采集,实现⽹络数据采集的程序通常称之为⽹络爬⾍或蜘蛛程序。即便是在⼤数据时代,数据对于中⼩企业来说仍然是硬伤和短板,有些数据需要通过开放或付费的数据接⼝来获得,其他的⾏业数据则必须要通过⽹络数据采集的⽅式来获得。不管使⽤哪种⽅式获取⽹络数据资源,Python 语⾔都是⾮常好的选择,因为 Python 的标准库和三⽅库都对获取⽹络数据提供了良好的⽀持。
HTTP requests
        要使⽤Python 获取⽹络数据,我们可以先安装⼀个名为 requests 的三⽅库,这个库我们在第 24 课中已经使⽤过了。按照官⽅⽹站的解释, requests 是基于 Python 标准库进⾏了封装,简化了通过 HTTP 访问⽹络资源的操作。说到HTTP 相信⼤家不会陌⽣,通常我们打开浏览器浏览⽹⻚时,我们就是使⽤了HTTP或 HTTPS HTTP 是⼀个请求响应式的协议,当我们在浏览器中输⼊正确的 URL (通常也称为⽹址)并按下回⻋(Enter ),我们就向⽹络上的 Web 服务器 发送了⼀个 HTTP 请求,服务器在收到请求后会给我们⼀个HTTP 响应,服务器给浏览器的数据就包含在这个响应中。我们可以使⽤浏览器提供的 开发者⼯具” 或是 抓包⼯具 (如: Fiddler Charles 等)来了解 HTTP 请求和响应到底是什么样⼦的,如下图所示。
        通过 requests 库,我们可以让程序向浏览器⼀样向 Web 服务器发起请求,并接收到服务器返回的响应,从响应中我们就可以提取出我们想要的数据。下⾯通过两个例⼦来演示如何获取⽹⻚代码和⽹络资源(如:图⽚),浏览器呈现给我们的⽹⻚是⽤ HTML 编写的,浏览器相当于是 HTML 的解释器环境,我们看到的⽹⻚中的内容都包含在HTML 的标签中。在获取到 HTML 代码后,就可以从标签的属性或标签体中提取我们需要的内容。获取搜狐⽹⾸⻚。
import requests
# requests的get函数会返回⼀个Response对象
resp = requests.get('https://www.sohu.com/')
if resp.status_code == 200:
 # 通过Response对象的text属性获取服务器返回的⽂本内容
 print(resp.text)
        获取百度Logo 并保存到名为 baidu.png 的本地⽂件中。⾸先在百度的⾸⻚上,右键点击百度 Logo ,并通过“ 复制图⽚地址 菜单获取图⽚的 URL
import requests
resp =
requests.get('https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d0fa7d55720d6cf.png'
)
with open('baidu.png', 'wb') as file:
 # 通过Response对象的content属性获取服务器返回的⼆进制内容
 file.write(resp.content)
        说明:关于 requests 库的详细使⽤⽅法,⼤家可以参考 官⽅⽂档 的内容。
访问⽹络数据接⼝
        国内外的很多⽹站都提供了开放数据接⼝,在开发商业项⽬时,如果有些事情我们⾃⼰⽆法解决,就可以借助这些开放的数据接⼝来处理。例如要根据⽤户或企业上传的资料进⾏实名认证或企业认证,我们就可以调⽤第三⽅提供的开放接⼝来识别⽤户或企业信息的真伪;例如要获取某个城市的天⽓信息,我们不可能直接从⽓象卫星拿到数据然后⾃⼰进⾏运算,只能通过第三⽅提供的数据接⼝来得到对应的天⽓信息。通常,提供有商业价值的数据的接⼝都是需要⽀付费⽤后才能访问的,在访问接⼝时还需要提供身份标识,便于服务器判断⽤户是不是付费⽤户以及进⾏费⽤扣除等相关操作。当然,还有些接⼝是可以免费使⽤的,但是必须先提供个⼈或者公司的信息才能访问,例如: 深圳市数据开放平台 蜻蜓FM 开放平台 等。如果查找⾃⼰需要的数据接⼝,可以访问 聚合数据 这类型的⽹站。
        ⽬前,我们访问的⽹络数据接⼝⼤多会返回JSON 格式的数据,我们在第 24 课讲解序列化和反序列的时候,提到过JSON 格式的字符串跟 Python 中的字典如何进⾏转换,并以 天⾏数据 为例讲解过⽹络数据接⼝访问的相关知识,这⾥我们就不再进⾏赘述了。
开发爬⾍ / 蜘蛛程序
        有的时候,我们需要的数据并不能通过开放数据接⼝来获得,但是可能在某些⽹⻚上能够获取到,这个时候就需要我们开发爬⾍程序通过爬取⻚⾯来获得需要的内容。我们可以按照上⾯提供的⽅法,使⽤ requests 先获取到⽹⻚的 HTML 代码,我们可以将整个代码看成⼀个⻓字符串,这样我们就可以使⽤正则表达式的捕获组从字符串提取我们需要的内容。下⾯我们通过代码演示如何从 ⾖瓣电影 获取排前250名的电影的名称。⾖瓣电影 Top250 ⻚⾯的结构和对应的代码如下图所示。
import random
import re
import time
import requests
for page in range(1, 11):
 resp = requests.get(
 # 请求https://movie.douban.com/top250时,start参数代表了从哪⼀部电影开始
 url=f'https://movie.douban.com/top250?start={(page - 1) * 25}',
 # 如果不设置HTTP请求头中的User-Agent,⾖瓣会检测出爬⾍程序⽽阻⽌我们的请求
# User-Agent可以设置为浏览器的标识(可以在浏览器的开发者⼯具查看HTTP请求头找
到)
 # 由于⾖瓣⽹允许百度爬⾍获取它的数据,因此直接将我们的爬⾍伪装成百度的爬⾍
 headers={'User-Agent': 'BaiduSpider'}
 )
 # 创建正则表达式对象,通过捕获组捕获span标签中的电影标题
 pattern = re.compile(r'\<span class="title"\>([^&]*?)\<\/span\>')
 # 通过正则表达式获取class属性为title且标签内容不以&符号开头的span标签
 results = pattern.findall(resp.text)
 # 循环变量列表中所有的电影标题
 for result in results:
 print(result)
 # 随机休眠1-3秒,避免获取⻚⾯过于频繁
 time.sleep(random.randint(1, 3))
        编写爬⾍程序⽐较重要的⼀点就是让爬⾍程序隐匿⾃⼰的身份,因为⼀般的⽹站都⽐较反感爬⾍。隐匿身份除了像上⾯的代码中修改 User-Agent 之外,还可以使⽤ 商业 IP 代理 (如: 蘑菇代理 芝麻代理 等),让被爬取的⽹站⽆法得知爬⾍程序的真实IP 地址,也就⽆法通过 IP 地址对爬⾍程序进⾏封禁。当然,爬⾍本身也是⼀个处于灰⾊地带的东⻄,没有谁说它是违法的,但也没有谁说它是合法的,本着 不禁⽌即为许可 的精神,我们可以根据⾃⼰⼯作的需要去编写爬⾍程序,但是如果被爬取的⽹站能够 证你的爬⾍程序有破坏动产的⾏为 ,那么在打官司的时候,基本上是要败诉的,这⼀点需要注意。
        另外,⽤编写正则表达式的⽅式从⽹⻚中提取内容虽然可⾏,但是写出⼀个能够满⾜需求的正则表达式本身也不是件容易的事情,这⼀点对于新⼿来说尤为明显。在下⼀节课中,我们将会为⼤家介绍另外两种从⻚⾯中提取数据的⽅法,虽然从性能上来讲,它们可能不如正则表达式,但是却降低了编码的复杂性,相信⼤家会喜欢上它们的。
简单的总结
Python 语⾔能做的事情真的很多,就获取⽹络数据这⼀项⽽⾔, Python ⼏乎是⼀枝独秀的,⼤量的企业和个⼈都会使⽤Python 从⽹络上获取⾃⼰需要的数据,相信这⼀点在现在或者将来也会是你⼯作中的⼀部分。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 517ttc.cn 版权所有 赣ICP备2024042791号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务