查看原文
其他

爬虫实战—获取号码标记数据 |附源码

小一 小一的学习笔记 2023-01-01

优秀不够,那就要无可替代!



作者 | 小一

全文共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入门基础汇总



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

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存