爬取去哪儿网酒店信息,再利用百度API将酒店地址的经纬度爬取!
Python3 的 selenium库可以模拟打开页面,获得加载完成的页面信息,一些基本用法,请自行度娘,就不再赘述了
1.将某城市的所有酒店链接爬取下来。
先打开两个酒店页面
**
https://hotel.qunar.com/cn/nanjing/dt-29906?fromDate=2020-05-18&toDate=2020-05-19&highQuality=falsehttps://hotel.qunar.com/cn/nanjing/dt-10236?fromDate=2020-05-18&toDate=2020-05-19&highQuality=true观察一下两个酒店链接有什么不同把两个链接的 ?fromDate=2020-05-18&toDate=2020-05-19&highQuality=false和?fromDate=2020-05-18&toDate=2020-05-19&highQuality=true 去掉再看一下网页没有变化,说明 /dt-29906 和 /dt-10236 是区别酒店的方式现在去主页面找到所有酒店的链接,把类似于 /dt-10236 的字符串提取出来
可以看到在酒店图片的标签中和酒店名字的标签中都有链接这里可以先写一个提取链接的正则表达式
r'<p class="price_new"><a href="(.*?)"><span' 1
只提取类似 /dt-10236 这样的字符串就可以了然后就是逐页提取先找到下一页的位置
browser.find_element_by_xpath('//div[@class="G_page clearfix"]/p[@class="next fl_right cur able"]').click() 1
用selenium库中的 .click()方法可以模拟点击这样就可以把所有页的酒店链接提取出来了
2.提取每个酒店的信息
url 是 https://hotel.qunar.com/cn/nanjing + 前面提取出的每个酒店对应的字符串进入酒店主页打开开发者工具寻找一下所需要的信息的位置
可以看到,酒店名称和地址都在这里了
r'</p><div class="name_cont">(.*?)</p></div>' 1
写个正则表达式,提取出来
上面其他酒店基本信息的位置请自行根据自己想提取的信息去写正则表达式然后将提取出的信息存入表格
提取完去哪儿的酒店的信息的表格样式
3.利用百度API和酒店地址将酒店地址的经纬度写入表格
首先在表格中添加两列,用以保存经度和纬度
然后去百度地图开放平台 链接:http://lbsyun.baidu.com/apiconsole/center#/home申请一个** AK, 申请方法请自行度娘查询地址的经纬度等信息的链接
http://api.map.baidu.com/geocoding/v3/?address= 地址
&output=json&ak= 在百度开放平台申请的AK &callback=showLocation用 xlrd 库来读取前面保存的表格的地址列把地址填入上面的链接中,链接中的信息如下图
用requests库把信息提取出来再用正则表达式把经度和纬度提取出来用xlutils库的xlutils.copy方法把之前xlrd读取的表格对象复制,赋给新的对象再用xlwt库将提取出的经度和纬度写入并保存为新的表格
到此完成所有信息爬取,下图是有经纬度的酒店信息表格示例
下面是部分代码
酒店链接提取部分代码
browser=webdriver.Chrome() url='http://hotel.qunar.com/cn/zhenjiang/?fromDate=2020-05-18&toDate=2020-05-19&cityName=%E9%95%87%E6%B1%9F' browser.get(url) time.sleep(5) p0=r'<p class="price_new"><a href="(.*?)"><span' r0=re.compile(p0) html=browser.page_source hotells=r0.findall(html) 12345678
酒店信息提取部分代码
text_url=url1+i dirver.get(text_url) time.sleep(6) html2=dirver.page_source p1=r'</p><div class="name_cont">(.*?)</p></div>' # 酒店名称和地址 p1name=r'<p class="name">(.*?)<span class="type"' # 酒店名称 p1add1=r'<p class="addr">(.*?)<span' # 酒店地址1 p1add2=r']</span>(.*?)<span class="map">' # 酒店地址2 p2=r'<div class="hotel_desc">(.*?)</div></aside>' # 酒店详情 p2cont=r'联系方式</dt><dd class="cont">(.*?)</dd>' # 联系方式 p2item=r'</span><span class="item">(.*?)</span></dd>' # 基本信息(多少间房) p2words=r'<div class="words(.*?)</p></div>' # 酒店简介 r1=re.compile(p1) r1name=re.compile(p1name) r1add=re.compile(p1add1) r2=re.compile(p2) r2cont=re.compile(p2cont) r2item=re.compile(p2item) r2words=re.compile(p2words) h1=r1.findall(html2) h1name=r1name.findall(h1[0]) h1add1=r1add1.findall(h1[0]) h1add2=r1add2.findall(h1[0]) h2=r2.findall(html2) h2cont=r2cont.findall(h2[0]) h2item=r2item.findall(h2[0]) h2words=r2words.findall(h2[0]) h2word=h2words[0] 12345678910111213141516171819202122232425262728
保存表格用xlwt库,具体请自行度娘
百度API经纬度信息提取部分代码
打开表格用xlrd库,具体请自行度娘
r=requests.get(addurl,headers=headers) time.sleep(1) addr=r.text rl1=r'{"location":{"lng":(.*?),"lat"' rl2=r'"lat":(.*?)},"precise"' lng=re.findall(rl1,addr) lat=re.findall(rl2,addr) 1234567
先用xlutils库的xlutils.copy方法把之前xlrd读取的表格对象复制,赋给新的对象再用xlwt库把经度和纬度信息写入新的对象并保存为新的表格结束
视频案例教程源码加群“1136192749