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
从⽹络上获取⾃⼰需要的数据,相信这⼀点在现在或者将来也会是你⼯作中的⼀部分。