小白学爬虫-进阶-获取动态数据(二)

优采云 发布时间: 2022-09-04 06:45

  小白学爬虫-进阶-获取动态数据(二)

  写在前面的话

  上节我们提到了网页动态数据的获取,介绍了通过分析 Ajax 请求,找到相应的接口进行抓取数据的方法。

  如果还不是很了解的话,可以再复习一下上节的方法:

  这节我们介绍如何通过 selenium 模拟浏览器进行数据获取。

  先来看一个例子,也是我以前做项目中的一部分内容。

  当你在搜狗搜索直接输入你的手机号码,你猜会出现什么?

  正常情况下应该是你的手机号码+运营商+归属地。

  但是可能会有一部分人会多一个标记,类似这种:

  为什么会有着这种标记呢?

  第一种情况是别人使用过这种软件对你进行了标记,俗称的人工打标签。

  第二种就是软件根据相应的算法进行标记,对你自动打了标签。

  咳咳,扯远了。

  那既然有这种标签,如果有一批用户号码,我们想要它的这种标记,可以爬下来吗?

  大胆尝试

  我们直接在浏览器上调出开发者工具,查看源码

  可以看到网页上的内容是这样的:

  其中,h4标签中有号码归属地和运营商信息,p标签中有号码标记信息。

  当然,这是我们直接在网页上查看源码看到的内容,但是不要忘了我们上节提到的动态数据。

  随便猜猜

  小一我猜数据会这样显示:

  对于这个网页来说,第一种也太简单了吧。

  如果真的网页这样写,数据获取这么简单,可能第二天程序员就会被祭天了。

  不过,对于想要获取数据的我们来说,这也,太香了吧!

  猜归猜,香归香,我们实际来看一下是什么样的

  还是熟悉的代码,还是熟悉的味道

  # 设置爬虫头部<br />headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}<br /># 直接爬取页面内容<br />response = requests.get(url=url, headers=headers)<br />response.encoding = 'utf-8'<br />

  复制好我们在浏览器中的 url ,然后运行上面的代码,看看我们能拿到什么数据

  只截取我们需要的一部分源码

  可以发现,源码中的 h4标签和 p标签都是空的。

  并没有像我们在网页中看到的那样。

  深入探索

  那么,是不是表示我们获取到的源码中没有这些数据?

  我们继续在源码中找一下,可以发现:

  在源码中存在我们需要的标记数据,但是数据是在 js 中放着。

  到这里,是不是恍然大悟:

  我们通过查询数据的接口,输入我们的查询 url,结果服务器返回的是并不是一个规整的 json 数据。

  而是一串 html + js 的代码,其中我们需要的数据是放在 js 中,而 html 中数据是空的。

  

  获取数据

  既然已经在源码中获取到了数据,尽管它在 js 中,但是我们还是可以把它拿出来,无非就是复杂一些。

  说到这,有没有想起我们在爬租房数据的时候,经纬度数据在哪吗?

  没错,也在 js 中,当时我们是通过正则表达式直接对内容解析。

  那我们可以用同样的方法去获取今天的数据:

  # 获取到 script定义数据<br />location_str = response.text[re.search(r'(18139, "10001001")+', response.text).span()[0]:<br />re.search(r'()+', response.text).span()[0]-27]<br /># 去掉多余字符并进行分割<br />str_arr = location_str.replace('"', '').replace("'", '').split(',')<br /># 确定需要的数据<br />number = str_arr[5]<br />tag = str_arr[6][8:-2]<br />number_detail = str_arr[9:12]<br /># 输出<br />print(number, number_detail, tag)<br />

  看一下输出的内容:

  # 输出结果,电话号码已手动处理<br />1333****443 ['广东', '深圳', '中国电信'] 快递外卖<br />

  可以正常获取,没有问题。

  但,有没有感觉这种方法会稍微麻烦一点,万一下次网页内容多了一个标点符号我们是不是就歇菜了?

  也确实是这样,正则表达式并不会像 Beautifulsoup 那样可以针对每个标签进行解析。

  那,有没有可以把 js 中的内容也显示在网页上,然后进行解析呢?

  成功的另一种方法

  知道问题,那当然就会有解决方法。

  通过 selenium 模拟浏览器访问,在页面加载完成之后拿到所有的网页源码。

  也就是说我们拿到的网页源代码是网页渲染结束之后的,这样的话,它页面长什么样我们就能拿到什么内容。

  selenium 是什么?

  先看介绍:

  selenium 是一个用于 Web 应用程序测试的工具。

  selenium 测试直接在浏览器中运行,就像真实用户所做的一样。

  Selenium 测试可以在 Windows、Linux 和 Macintosh上的 Internet Explorer、Edge、Safari、Chrome和 Firefox 中运行。

  其中有一点对于我们爬虫来说很重要:

  selenium 框架底层使用 JavaScript 模拟真实用户对浏览器进行操作。

  测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。

  也就是说, selenium 可以模拟我们的正常浏览器操作,更使得我们的爬虫可见即可爬

  下面一起来看一些如何使用 selenium 进行爬虫:

  安装 selenium

  和安装其他 Python 模块一样,直接 pip install selenium 就行了

  当出现 successful 表示安装成功

  下载相应的浏览器驱动

  selenium 支持 IE、Chrome、Firxfox 等多款浏览器

  下载之前,先看一张谷歌浏览器对应的驱动表

  只列举了部分,如果上面没有你的 Chrome版本,那应该就是你的版本太旧了,快快更新!

  怎么看自己的 Chrome 浏览器版本号?

  打开-->谷歌-->右上角-->帮助-->关于

  找到版本号之后,对应下载自己的版本驱动

  列两个下载速度比较快的源,大家参考下载:

  

  安装,配置

  这里有两种方法,我目前在用第一种

  解压驱动到本地,然后在代码调用的时候,设置驱动路径即可;

  解压驱动到本地,添加可执行文件路径到环境变量中,代码中直接调用。

  根据个人喜好选择吧,只要你的驱动和浏览器能对的上,就没有问题

  使用selenium

  导入相应模块

  from selenium import webdriver<br />

  运行一下代码进行测试:

  browser = webdriver.Chrome(executable_path="D:\software\install\chromedriver_win32\chromedriver.exe")<br />browser.get(url)<br />

  其中,后面的 executable_path 就是你解压之后的路径,这里你需要修改成自己的。

  查看网页源码:

  # 输出网页源码<br />content = browser.page_source<br />

  使用 Beautifulsoup 进行网页解析

  # 网页解析开始<br />soup = BeautifulSoup(content, 'html.parser')<br />

  到这里了,熟不熟悉?

  这不就是前两个小节中我们频繁的使用 Beautifulsoup 进行网页解析吗?

  看一下我们通过 selenium 获取到的数据:

  # 解析 js获取到的数据<br />133****4443 ['广东', '深圳', '中国电信'] 快递外卖<br /># 通过 selenium 获取到的数据<br />133****4443 广东深圳中国电信 快递外卖<br />

  结果基本没差别,都可以获取到想要的结果。

  相对而言,在网页的解析、爬虫流程上,通过 selenium 会更直观一些,毕竟可见即可爬。

  总结一下

  对于动态数据,我们介绍了一种更直观、更简单的方法去获取。

  通过安装 selenuim、下载安装浏览器驱动,设置驱动到编译环境中,利用 selenium 获取网页渲染后的源码,通过 Beautifulsoup 进行源码解析。

  扯个题外话:对于 selenium 的使用,网上褒贬不一。

  小一觉得:对于专注于爬虫技术的同学,可能 selenium 不是最好的选择,毕竟效率不高。但对于只是想获取数据、不追求效率的同学,多一门技能也不是坏事。

  源码获取

  这节源码基本都在文章中出现了,我也会更新在 GitHub上。

  后台回复加群进入数据分析交流群(欢迎加群)

  写在后面的话

  我在几天前就换了引导语,由原来的没有灵魂的搬砖者到现在的要做一个无可替代的人。

  新的一年,已经开始了,一定要默默为自己加油喔!

  做一个无可替代的人!!

  Python系列

  Python系列会持续更新,从基础入门到进阶技巧,从编程语法到项目实战。若您在阅读的过程中发现文章存在错误,烦请指正,非常感谢;若您在阅读的过程中能有所收获,欢迎一起分享交流。

  如果你也想和我一起学习Python,关注我吧!

  学习Python,我们不只是说说而已

  End

  如果对你有用,就点个在看吧

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线