selenium模拟浏览器-----爬取马蜂窝地区全部景点
为什么使用selenium
在前面的文章中,我们了解了Ajax的分析和爬取方式,但是,对于参数加密复杂的网页来说,用之前构造请求头的方法来爬取数据未免显得困难,所以这里我们选择了使用selenium。
Selenium是一个自动化测试工具,通过它我们可以驱动浏览器执行特定的动作,对于一些参数加密复杂的javaScript渲染的页面来说,抓取效果很好。采用selenium,我们可以做到可见即可爬的效果。
selenium安装(不详细介绍,只介绍步骤)
- 这里我们直接采用pip来安装selenium: pip install selenium
- 安装Chrome以及ChromeDriver驱动:这里选择的chrome的版本需要与ChromeDriver匹配
- 下载好后,将ChromeDriver的可执行文件配置到环境变量中
- 验证安装:
- 上面的步骤配置完成后,在终端命令行下输入Chromedriver,输出Strating.........Only local connections are allowed,即安装成功
- 或者创建如下python代码:
from selenium import webdriver
browser=webdriver.Chrome()
运行之后,弹出一个空白的Chrome浏览器,则证明安装成功。
爬取马蜂窝地区全部景点代码
- 对于selenium的一些基本知识,可以自行到selenium中文文档中学习,内容简短,充分提升自己的个人学习能力。
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from pyquery import PyQuery as pq
import time
import os
import urllibbrowser=webdriver.Chrome()
wait=WebDriverWait(browser,10)
url='http://www.mafengwo.cn/jd/10206/gonglve.html'
browser.get(url)
aomeng={}def index_page():try:#获取总页数page_total=browser.find_elements_by_css_selector('span.count')total=page_total[0].texttotal_page=total[1:3]for i in range(1,int(total_page)-4):print('正在爬取第',str(i),'页')#实现下一页submit=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.m-pagination > a.pi.pg-next')))submit.click()html=browser.page_sourceparse_page(html)#print(html)except TimeoutException:print('超时')finally:browser.close()def parse_page(html):doc=pq(html,parser="html")items=doc('.bd .scenic-list.clearfix .img').parent().items()for item in items:#标题aomeng['title']=item.find('h3').text()#子页链接aomeng['href']=item.attr('href')#图片链接aomeng['img']=item.find('.img').find('img').attr('src')time.sleep(3)save_img(aomeng)
def save_img(aomeng):if not os.path.exists(aomeng['title']):os.makedirs(aomeng['title'])with open('{0}/{0}.{1}'.format(aomeng['title'], 'txt'), 'a',encoding='utf-8')as f:f.write(aomeng['href'])print('写入txt文件成功')try:file_path = '{0}/{0}.{1}'.format(aomeng['title'], 'jpg')if not os.path.exists(file_path):urllib.request.urlretrieve(aomeng['img'], file_path)print('img 存入success!')else:print('Already Download')except :print('img 存入fail!')passindex_page()
运行结果:
2.也可以采用之前构造参数的方式爬取(这里引用公众号: Python绿色通道 的方法):这里我们只介绍获取数据页代码,具体的解析,自行根据需要解析:
先抓包,在xhr中点击一次下一页,就有生成三个页面。其中所需要的内容在router.php中。
找到这个js文件http://js.mafengwo.net/js/hotel/sign/index.js?1552035728。在第363行和第364行打上断点,然后点击下一页。
第363行会生成一个json变量 _0xe7fex39。在第364行,首先运行这一部分:(JSON[__Ox2133f[60]](_0xe7fex39) + _0xe7fex34)即生成一个字符串类型的变量:"{"_ts":"1553500557401","params":"{\"poi_id\":\"87950\",
\"page\":1,\"just_comment\":1}"}c9d6618dbc657b41a66eb0af952906f1"
然后再通过函数_0xe7fex2生成32位的字符串;最通过slice(2,12)函数对其进行切割,获得2-12的字符串,这个就是_sn的值。
查找这个函数发现_0xe7fec函数将变量生成一个长度为4的数组;在通过_0xe7fex10函数将数组生成对应的字符串;最后将_0xe7fex15拼接起来。
而拼接后的这串字符的2-12位就是_sn值。这整个加密过程就是常说的md5加密。右边的加密结果和_0xe7fex15拼接起来的字符串是完全一样的;
此时生成的_sn值bc28b3ed57就是对参数进行md5加密取2-12位的结果。
得到_sn值后,评论数据就可以很容易就得到。这里要注意的是,在请求是必须把url拼接完整,否则只会返回一点点数据。另外在生成_sn时,参数qdata必须保持一致,是双引号就是双引号,有反斜杠就要有反斜杠,不然得不到正确的_sn值。
代码:
import hashlib
import requests#可将t改为你想爬取的地区参数
t=1556449494051def par(t):hl = hashlib.md5()hl.update(t)return hl.hexdigest()[2:12]def get_page():for i in range(19):print('第'+str(i)+'页')page=str(i)#可将iMddid改为你想爬取的地区码qdata = '{"_ts":"' + str(t) + '","iMddid":"10206","iPage":"' + str(page) + '","iTagId":"0","sAct":"KMdd_StructWebAjax|GetPoisByTag"}c9d6618dbc657b41a66eb0af952906f1'sn = par(qdata.encode('utf-8'))url = "http://www.mafengwo.cn/ajax/router.php"data = {'sAct': 'KMdd_StructWebAjax|GetPoisByTag',#可将iMddid改为你想爬取的地区码'iMddid': '10206','_ts': t,'iPage': page,'iTagId': '0','_sn': sn}headers = {'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"}response = requests.request("POST", url, headers=headers,data=data)print(response.text)get_page()
selenium模拟浏览器-----爬取马蜂窝地区全部景点相关推荐
- 用selenium模拟浏览器爬取淘宝订单信息
用selenium模拟浏览器登录淘宝爬取自己购买商品的订单信息,代码不是十分完善,但是亲测可用,后期还可以进一步优化. 链接:https://pan.baidu.com/s/1aGwWCFaWPfOU ...
- python爬虫:Selenium模拟浏览器爬取淘宝商品信息
1.数据提取前期网页分析 分析:淘宝网页数据也是通过Ajax技术获取的,但是淘宝的API接口参数比较复杂,可能包含加密密匙等参数:所以,想要通过自己构造API接口获取完整网页信息很难实现(可能只有部分 ...
- Python使用selenium模拟浏览器爬取某查查数据
在使用爬虫爬取某查查的数据的时候,会被识别到,进行反爬限制,最后使用selenium模拟浏览器进行爬取. 这里解决办法主要使用selenium打开浏览器,模拟人操作进行爬取,代码: ua = 'Moz ...
- Python爬虫实战03:用Selenium模拟浏览器爬取淘宝美食
1 目标站点分析 淘宝页面信息很复杂的,含有各种请求参数和加密参数,如果直接请求或者分析Ajax请求的话会很繁琐.所以我们可以用Selenium来驱动浏览器模拟点击来爬取淘宝的信息.这样我们只要关系操 ...
- 解决selenium模拟浏览器爬取(淘宝、微博等需要登陆验证的网站)多次登陆问题
在爬取淘宝等需要登陆的网站时,模拟点击打开新的页面往往需要重新登陆,这时可以通过采用本地打开一个浏览器,设置监听端口,在该端口下模拟浏览器,这样浏览器会记住所有的用户行为,只要登陆过一次就不必重复登录 ...
- 利用python加selenium模拟浏览器爬取百度爱企查企业详细信息
目录 说明 企查查网页构成方式 代码与详解 说明 本人不是什么爬虫大佬,只是最近在做一个项目的时候需要根据企业的名称把企业的信息爬取下来,例如营业执照.工商注册号等.在网上找了很多的信息与资源,都不是 ...
- python 爬虫动态网页的区别_Python开发爬虫之动态网页抓取篇:爬取博客评论数据——通过Selenium模拟浏览器抓取...
区别于上篇动态网页抓取,这里介绍另一种方法,即使用浏览器渲染引擎.直接用浏览器在显示网页时解析 HTML.应用 CSS 样式并执行 JavaScript 的语句. 这个方法在爬虫过程中会打开一个浏览器 ...
- 3.使用Selenium模拟浏览器抓取淘宝商品美食信息
# 使用selenium+phantomJS模拟浏览器爬取淘宝商品信息 # 思路: # 第一步:利用selenium驱动浏览器,搜索商品信息,得到商品列表 # 第二步:分析商品页数,驱动浏览器翻页,并 ...
- scrapy模拟浏览器爬取51job(动态渲染页面爬取)
scrapy模拟浏览器爬取51job 51job链接 网络爬虫时,网页不止有静态页面还有动态页面,动态页面主要由JavaScript动态渲染,网络爬虫经常遇见爬取JavaScript动态渲染的页面. ...
最新文章
- 数据库审计服务器性能要求,数据库审计技术指标资质要求-.docx
- 基于改进的RPCA人脸识别算法
- 【算法分析】实验 4. 回溯法求解0-1背包等问题
- remmina连接xfce桌面的centos7
- PHP简易网页访问统计源码
- USACO 5.3 Window Area
- 动易自定义标签HTML输出,动易标签【ArticleList】
- html中table分页显示,html中table表格分页
- AcrelEMS-IDC数据中心综合能效管理解决方案
- vmware虚拟机的作用
- vm怎么上传镜像文件到服务器,vmware怎么添加iso镜像文件-vmware添加iso镜像文件的方法 - 河东软件园...
- tensorbook深度学习笔记本电脑
- Safe Browsing
- VxWorks6.6运行简单的ACE/TAO CORBA程序
- 厨电智能化趋势下,究竟什么才是真正的“用户思维”?
- 系统主题修改桌面嵌入html,更换主题桌面主题 Win7桌面动态主题怎么更换
- Spring框架中的Bean
- Ubuntu 20.04 ROS2 Foxy安装
- centos7搭建http服务器访问文件目录列表
- 嘉立创eda专业版需要注意的点总结