赞
踩
需求:获取大众点评官网上上海地区的全部餐饮信息(店名,商圈,星级,评论数,人均数,口味评分,环境评分,服务评分,地址,电话等信息)
分析:餐饮种类分为18种,每一种下面又有子分类!
接着我们拿一个种类来分析的它的页数,会发现最多只有50页。所以没办法,我们就能或者每个种类的50页信息!
再来,就是分析店家中我们所有获取的信息了,我们按F12,点击店家信息,就会发现有些信息,就只显示了串字符,并不想我们想象中那样,直接显示出来!好的,这就是大众点评的一个加密方式,我们网页上只有看到的信息,是通过图片映射出来的,所有查看源码就很清晰的发现只是一串字符!
现在就开始着手分析加密方式了!老方法F12,开发者工具来一步步分析!在这里,我们需要注意三个东西,第一个就是url,第二个就是css,第三个就是宽高!
接着我们打开css(http://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/a1b35e043d242cf3f26a907283c9d14f.css),发现所有那些加密的字符串,都是通过css样式,显示出来的!而background:-330.0px -141.0px,正是映射的关键。如果你改一下这些px值,就会发现原本的网页中的文字变动了,那我们就可以大胆的推测下,图片文字的映射就是通过background中的值,来投射到网页中。我们一开始就注意到了网页中文字的宽高,那我们用background值去除以这个宽高,x=330/14(width)=23.57=24(四舍五入),y=141/31(height)=4.54=5(四舍五入),算出x,y之后,我就想,那这x,y会不会就是对应着文字中的行和列呢,我就是试了一下。结果发现就是我想的那样。x,y就是对应文字中的行和列。那么这个加密就算破解了!
#地址解密
def get_text(id):
#获取加密的值的x,y坐标,例如:zogwtn
re_wqd=re.compile(r"\.%s{background:-(\d+)\.0px -(\d+)\.0px;}" % id)
time.sleep(0.1)
wqd = re.findall(re_wqd, one)
x=wqd[0][0] #x坐标
y=wqd[0][1] #y坐标
sum_x=int((int(x)/14)) #计算x偏移量
sum_y=round(int(y)/34) #计算y的偏移量
if sum_y!=0:
sum_y -=1
# print("x轴:{},y轴:{}|x偏移量:{},y偏移量:{}".format(e,f,sum_e,sum_f))
#获取到加密的数字组
url_qfr="http://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/882b981e5726db198e310153eb7a2615.svg"
# url_content="http://s3plus.meituan.net/v1/mss_0a06a471f9514fc79c981b5466f56b91/svgtextcss/55c0bcb254f6c74cd3e2bb4075502a96.svg"
response=requests.get(url_qfr,headers=head.headers).text
get_wqd=re.findall(">(.+?)",response)
wqd_list=[]
for i in get_wqd:
wqd_list.append(list(i))
return wqd_list[sum_y][sum_x]
搞定这个加密破解一下,那我们就可以获取所需的数据了!最后把数据保存在MySQL中。
还值得一提的就是,这个验证码,大众的验证码分为两种,一种是滑动,一种是输入文字。
一开始,想着怎么破解这个验证,结果用尽毕生所学也搞不了,那只能上大杀器了selenium,每当需要验证的时候就自动弹出窗口,手动验证!(手动滑稽)真的没辙了,只能想出这个办法了!不过也还行,验证一般大半个小时才会提示验证一下。只要手动验证完就有可以接着爬取了!
最后的成果:
总结:爬取的数据量,还是有点小多,一开始爬,我就只用了单线程,白天大概就爬4,5千这样的数据(一般爬6个小时),然后我发现太慢了,就改进一下用多线程,速度就提升了一倍,一样的时间可以爬取1万多条数据。主要还是不敢爬太快,一是怕被封ip,二是怕给它网站服务器造成伤害。就慢慢爬!JXiuFen/dazhonggithub.com
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。