爬虫实战—获取号码标记数据 |附源码
优秀不够,那就要无可替代!
作者 | 小一
全文共2260字,阅读全文需9分钟
写在前面的话
实战还是老规矩,目前为止,你应该已经了解爬虫进阶的两个小节:
前两节我们已经正式开始了爬虫进阶的内容
从入门到进阶我们只做了两个小项目,就开始了进阶的内容
其实我也想了挺久的
现在的网页基本都是动态数据,动不动就是异步加载,入门的知识已经很难让我们继续爬到数据了,所以我决定开始带大家进阶!
进阶部分我会适当的加一些小的项目,等到爬虫框架什么的都说完了 ,我们最终是要做一个大项目的。
稍稍透露一下:
我有一个微博小号,每天会自动的发一些动态,自动配相应主题的图片,有时候还会发一些热点话题。
以上的功能都是Python爬虫实现的不过因为我不会运营,微博发了好几百条,也没啥用。(有微博运营的大佬可以带我嘛)
这不,刚来了两节进阶课,我就稍稍整理了一下,来一节小的实战。
今天的实战前面也说到过,就是获取电话号码的标记
实战就不会再介绍任何概念了,还不懂相关概念的可以自行复习一下。
开始 selenium 实战
selenium 作为一款自动化测试工具,我们需要浏览器去模拟我们的操作,那前提是我们先明确自己的流程。
ok,接下来一起分析一下我们自己的获取标记流程
分析流程
在搜索界面,按 F12
打开开发者模式,方便我们进行流程分析。
在开发者模式中,切换到 NetWork 选项卡。
输入需要查找的号码,点击查询,可以看到在开发者显示框中出现了许多的链接。
直接拉到最上面,应该会看到第一条链接,前面内容是这样的:
https://www.sogou.com/web?query=
另外,它的 url 和浏览器网址输入栏的 url 是相同的。
这就是我们输入号码查询之后,网页进行的二次跳转。
那么,这个网址就是我们的 base_url
了。
查询的时候只需要在后面加上号码就可以了。
点击第一条链接,直接切换到 Response
中,可以看到服务器响应的具体数据
其中有很大部分内容都是网页的 css,部分内容是 html,还有相应的一些 js代码。
以及我们需要的标记数据:
分析后的总结
根据前两节的内容我们可以知道,获取动态数据可以通过接口和自动化测试工具两种方法。
但是通过分析我们并没有发现有相应的接口,只是网页进行了一次跳转
。
所以通过接口这种方式在此处不适用。
既然最终的网页显示上存在我们需要的数据,那我们就可以用第二种方法:通过 selenium 自动化测试工具爬取数据。
模拟获取
上一节我们已经安装好了 selenium 以及相应的驱动,还没安装好的同学参考本文最前面的
selenium篇
导入 selenium 模块
from selenium import webdriver
加载我们的浏览器测试一下:
后面的 executable_path 就是你解压之后的路径,这里你需要修改成自己的
browser = webdriver.Chrome(executable_path="D:\software\install\chromedriver_win32\chromedriver.exe")
这个时候,我们的浏览器会弹出一个空白窗口。
至于代码写好了,不想要弹出这个窗口,后面也会有介绍方法
这就是 selenium 的魅力了,这个窗口的所有动作我们都可以通过代码去操控。
“你让它干啥它就干啥”
那我们当然是进入到搜索页面了:
我们需要自行构造 url, 你们不妨试试换成自己的号码
# 构造url 并获取内容
url = 'https://www.sogou.com/web?query=156****3767'
browser.get(url)
# 输出网页源码
content = browser.page_source
有的同学可能会遇到编码报错,这个时候你需要一下操作:
# 在gbk解码时忽略掉不能解码的数据
print(content.encode("gbk", 'ignore').decode("gbk", "ignore"))
看一下爬虫爬取到的数据:
没有问题,中间的网页标红部分正是我们需要的电话号码标记。
这样一来,我们选用的数据就已经拿到了,而且还很规整的在网页中显示。
解析结果
又是熟悉的操作,上 Beautifulsoup,开始解析网页:
from bs4 import BeautifulSoup
# 解析网页
soup = BeautifulSoup(content, 'html.parser')
解析我们需要的字段
# 获取手机号码
number = soup.find_all('span', id='phoneid')[0].get_text()
# 获取归属地和运营商
soup_class = soup.find_all('i', class_='phonenumberdetail')[0]
# 在gbk解码时忽略掉不能解码的数据
number_detail = soup_class.get_text().encode("gbk", 'ignore').decode("gbk", "ignore")
# 获取标记
tag = soup.find_all('span', class_='haoma-tag')[0].get_text()
手机号码:id="phoneid"
的 span 标签的内容
归属地等:class="phonenumberdetail"
的 i 标签的内容
号码标记:class="haoma-tag"
的 span 标签的内容
如果提示编码解码错误可以忽略掉不能解码的数据
我们需要的数据就已经轻松拿到,流程结束!
不显示弹窗
chrome 推出了 headless 模式,可以通过以下设置不弹出浏览器
# 导入相应模块
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
# 设置不弹出浏览器
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
browser = webdriver.Chrome(chrome_options=chrome_options,executable_path=executable_path)
总结一下
对于这种在 js 中的代码,渲染之后才会出现在浏览器中,最好的办法就是通过 selenium。
如果说,js 中的数据超级容易获取,那上句话当我没说。
现在的网页 js 都特别多,如果数据不能很快速的从 js 中获取,那真的可以大胆用一下 selenium。
还是那句话,我们是任务驱动型,只要能完成任务就行,管它网上对 selenium的褒贬不一呢。
源码获取
这节源码都在文章中出现了,我也会更新在 GitHub上。
后台回复加群
进入数据分析交流群(欢迎加群)
写在后面的话
最近抽空我会写关于 Python 高阶
的相关内容
其实有些内容我也用的很少,但是说实话,我在查了之后才发现真的特别有用。
我会尽快写好分享给你们。
高阶篇内容会多一些,会包括 Pandas 和 Numpy的一些用法,大家期待一下吧。
碎碎念一下
如果你们有什么觉得有趣的小项目可以后台分享给我
当然,有什么搞不定的小项目也可以一起交流学习
Python系列
Python系列会持续更新,从基础入门到进阶技巧,从编程语法到项目实战。若您在阅读的过程中发现文章存在错误,烦请指正,非常感谢;若您在阅读的过程中能有所收获,欢迎一起分享交流。
如果你也想和我一起学习Python,关注我吧!
学习Python,我们不只是说说而已
End
限时领取,100G+数据分析干货资料免费领Python入门进阶汇总(全)
Python入门基础教程-补充
Python入门基础汇总