selenium爬取数据

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

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

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

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

图片

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

第一种情况是别人使用过这种软件对你进行了标记,俗称的人工打标签
第二种就是软件根据相应的算法进行标记,对你自动打了标签。

咳咳,扯远了。

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

大胆尝试

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

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

图片

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

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

随便猜猜

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

  • 号码标记信息可能直接放在网页中

  • 号码标记等信息是在 js 中放着,在页面渲染的时候才会将数据插入到网页中

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

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

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

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

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

# 设置爬虫头部
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'}
# 直接爬取页面内容
response = requests.get(url=url, headers=headers)
response.encoding = 'utf-8'

  

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

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

图片

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

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

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

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

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

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

获取数据

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

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

图片

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

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

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

  

看一下输出的内容:

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

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

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

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

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

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

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

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

selenium 是什么?

先看介绍:

selenium 是一个用于 Web 应用程序测试的工具。
selenium 测试直接在浏览器中运行,就像真实用户所做的一样。


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

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

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


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

 
posted @ 2022-03-14 10:20  青竹之下  阅读(324)  评论(0编辑  收藏  举报