关于使用requests.get(url)获取不到页面全部内容的记录--使用selenium有效解决

关于如何使用selenium解决requests.get(url)获取不到页面全部内容的记录

今天在尝试使用requests库进行PWA封禁信息爬取时出现了提取到的字符数组为空的情况,详细信息如下:


问题描述

这里展示部分项目源码与页面源码:

如图所示,id = “root”对应的div中包含有我们想要获取的信息
页面源码

项目源码
修改前的项目代码

获取到的结果
content

可以看到id = "root"对应的div中并没有信息,也就是说通过这种方法获取到的页面源码是不完整的


解决方案:

通过尝试,发现使用selenium库通过模拟当前浏览器可以完整地获取页面源码。
selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。
Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。
selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。


具体实现:

1.首先在设置中查看浏览器版本号,去浏览器官网下载对应版本的浏览器驱动。本次项目使用的是Edge浏览器,即去微软官网下载Edge浏览器驱动,并将驱动放在Python安装目录/Scripts下。
将驱动置于python安装目录的Scripts目录下

2.修改后的项目代码如下:

from lxml import etree
from selenium import webdriver
browser = webdriver.Edge()
url = "https://pvp.wanmei.com/csgo/ban"
browser.get(url)
browser.encoding = "utf-8"
browser.page_source

使用Jupyter服务器可以方便的查看每一个步骤的运行结果:
新爬取的页面源码

3.可以看到:此时id = "root"对应的div下是有内容的,接下来的任务即通过Xpath定位获取目标文本
举例如下,进一步实现:

from lxml import etree
from selenium import webdriver
browser = webdriver.Edge()
url = "https://pvp.wanmei.com/csgo/ban"
browser.get(url)
browser.encoding = "utf-8"
browser.page_source
html = etree.HTML(browser.page_source)
html
con = html.xpath("/html/body/div[2]/div[3]/div/div/div[7]/div[3]/text()")
con = str(con)
con
begin = con.index("'")
# begin
end = con.index("']")
con = con[begin + 1 : end]
con

再次查看当前运行效果:
获取到的信息
我们成功获取了一名用户的封禁信息
需要注意的是,在使用Xpath时,需要添加 /text() 来获取文本信息。

4.在模拟浏览器中操作完成后,关闭浏览器:

browser.close()

还需注意的是,可能出现的报错:
1>在未下载浏览器驱动时提示需要将驱动添加至path,在将驱动添加到Scripts目录下后报错消失。
2>如未下载对应浏览器的驱动,可能报错:未找到目录。例如,在未拥有Chrome的情况下使用ChromeDriver驱动可能会报此错 误。

还需要继续学习!

  • 5
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果使用BeautifulSoup解析HTML代码时无法获取页面元素,可能是以下几个原因: 1. 页面元素是通过JavaScript动态生成的,而BeautifulSoup无法解析JavaScript代码。这种情况下可以尝试使用selenium等工具模拟浏览器操作,等待元素加载完成后再获取。 2. 页面元素是在iframe或者frame中嵌套的,而BeautifulSoup默认只能解析主文档中的元素。这种情况下可以尝试使用BeautifulSoup中的find_all方法的recursive参数设置为True,以便递归查找所有iframe或者frame中的元素。 3. 页面元素的位置、属性等信息有误,导致无法匹配到元素。这种情况下可以尝试使用浏览器的开发者工具查看页面元素的具体信息,然后再进行匹配。 下面是一个使用BeautifulSoup递归查找所有iframe或者frame中的元素的示例代码: ``` from bs4 import BeautifulSoup import requests # 发送请求获取HTML代码 url = 'http://example.com' response = requests.get(url) html = response.text # 解析HTML代码 soup = BeautifulSoup(html, 'html.parser') # 查找所有iframe和frame中的元素 elements = soup.find_all(recursive=True) for element in elements: print(element) ``` 在上面的代码中,我们首先发送请求获取HTML代码,然后使用BeautifulSoup解析HTML代码。接着,我们使用find_all方法的recursive参数设置为True,以便递归查找所有iframe或者frame中的元素。最后,我们打印出所有找到的元素。通过以上方法,我们可以递归查找所有iframe或者frame中的元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值