网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
当我们打开浏览器浏览网页的时候 我们通常会通过输入一个网址来进行访问,熟悉tomcat的工作原理的应该知道,浏览器实际上是向tomcat发送一段http请求,然后服务器找到请求的文件地址通过流来返回给浏览器,然后浏览器将返回的页面做一个解析。然后返过来看爬虫,其实就是模拟了浏览器发送请求的这一发送这一动作,但是页面可以自己解析,所以说,可以把浏览器看成一个巨大的爬虫外挂,这个可以去了解seleium这个爬虫工具了解seleium点击这里,简单又实用,但是效率是比较差的。其实熟悉后端开发的人都知道,数据是动态的,然而一般前端是通过调用一些接口来到页面上面绑定数据的,所以,为了提高爬取效率,可以找到这个这个请求的地址,然后通过模拟发送http请求来得到数据。
知道了原理 ,首先就要了解百度API 下面就开始爬取长沙市所有小区
- 可以先尝试一下接口 各个参数的含义API里面均可查找,采用的是矩阵pol搜索 点击可调用百度API的接口
百度对于一次性爬去做了限制,每次请求最多返回400条信息,但是一个区域里面这么大,400条数据是会遗漏很多,解决的办法是发送多次请求,如下图所示,将区域进行分片,一般是将其分成15*15,这样每一次请求就可以只针对小范围里面的区域取检索,这样获取的信息相对较为全面
分片代码附上
windowSize = {
'xNum': 16.0,
'yNum': 16.0
}
for index in range(int(WindowSize['xNum'] * WindowSize['yNum'])):#总共循环16*16次
#获取x轴的偏移量 即这个1号小矩行的长
offset_x = (bigRect[city]['right']['x'] - bigRect[city]['left']['x'])/windowSize['xNum']
#获取y轴的偏移量 1号小矩行的宽
offset_y = (bigRect[city]['right']['y'] - bigRect[city]['left']['y'])/windowSize['yNum']
#即每一次循环小矩行左下角的坐标 %就是每16这里的x轴就会返回到1 // 这个运算符就是当你循环次数少于16次的时候保持y上面的象限不变
left_x = bigRect[city]['left']['x'] + offset_x * (index % windowSize['xNum'])
left_y = bigRect[city]['left']['y'] + offset_y * (index // windowSize['yNum'])
#x向量和y向量相加即可得到右上角的坐标
right_x = (left_x + offset_x)
right_y = (left_y + offset_y)
smallRect = str(left_y) + ',' + str(left_x) + ',' + str(right_y) + ',' + str(right_x)
上面的代码即就是完成分片了,剩余的就是要不断发请求了,可以采用重试机制 当一次请求出现超时的话,可以重试三次,这事重试机制的代码,采用递归来实现
def url_retry(url,num_retries=3):
print("access!",url)
try:
request = requests.get(url,timeout=60)
res = json.loads(request.text)
#raise_for_status(),如果不是200会抛出HTTPError错误
except requests.HTTPError as e:
res=None