项目场景:
本文是描述本人在使用爬虫进行动态网页数据(在网页中想要爬取的数据不在该网页的源代码中)的爬取时,遇到了问题和爬取动态网页的解决。
问题描述
我在学校学习时,使用的是selenium进行爬取网页的数据,在爬取一般的网页时能够正常的爬取,在我做另外的项目的时候爬取的数据使用selenium爬取居然连网页都进不去,显示的窗口直接是一片空白,使用了在网上selenium设置反反爬都不行,下面的一部分是使用browsermobproxy,进行爬取时遇到的问题(我电脑上有原来安装的java18的版本与最新的browsermobproxy版本冲突了,需要改成java8的版本)。修改成功后也是连网页都进不去。最后经过几天的查询,找到了另外的方法进行解决,使用from seleniumwire import webdriver 方法是对selenium库进行了扩展的。
原因分析:
我电脑上原本的java的jdk版本是18.几,几乎是最新的,但是browsermobproxy在start这一步的时候就已经报错,这个问题时因为两个版本冲突了,browsermobproxy最新的已经是browsermob-proxy-2.1.4版本了,对应的jdk版本居然是jdk8
解决方案:
在电脑上重新安装一个jdk8环境,有两个版本在电脑上也会不冲突,我就没有删除原来的那个版本(jdk8是一个长期版本,很多人使用的),安装两个环境以后,后面安装的那个版本会覆盖之前的那个版本。安装好jdk8版本后需要重启电脑,
jdk8安装包和教程链接:jdk安装教程
需要说明的是在安装jdk环境时,似乎不能更改安装路径,否则会报错(我本来是想安装到D盘的,结果他会安装失败),
重启电脑就能成功运行
server.start()
在这一部分,是为将使用browsermobproxy爬取不了网页的人引入到这里,下面使用的方法直接帮我解决了网页的爬取。
我使用的环境:
python 3.7
selenium-wire 5.1.0
window 11
时间:
2023/2/8
安装
pip install selenium-wire
导入库
from seleniumwire import webdriver
使用库之前先将selenium将Google Chrome的路径进行修改
点击桌面的谷歌浏览器,
点击属性,进入下图界面
将浏览的路径最后面加上
--remote-debugging-port=9222
在按确定进行修改(这是一种设置爬虫的方法)
下面这个连接里有很多的selenium反反爬的设置:反反爬相关设置
from seleniumwire import webdriver
import time
wd = webdriver.Chrome()
wd.get(current_url) # 这里的网页就不拿出来了
time.sleep(3) # 加载网页信息
res = wd.requests # 得到网页的信息
for request in res:
if request.response: # 得到目标网页的响应
if request.path == "/uniontrain/trainapi/TrainPCCommon/SearchTrainRemainderTickets": # 因为我爬取的网页数据没在响应的数据中只能找到相关的子链接进行爬取数据,我爬取的网页path具有唯一性,都找到我想要的所有数据
train_url=request.url # 查看想要的数据是否在request.response中可以debug到request.response,查看里面的信息。
# 这里的request.url就是我想爬取的数据的网页了
# 查看想要的数据是否在request.response中可以debug到request.response,查看里面的信息。
子网页中数据格式为jQuery22222 ()的数据(下面是进入子网页查看到的内容)
将数据得到后是字符串的形式,我们需要将字符串转化成json文件,直接使用
json.loads函数是会报错的,需要先将'jQuery183026019933464466005_1675845834371('和最后面的一个)进行删除
data.split("(", 1)[1].rsplit(")", 1)[0]
下面是我将子网页的数据进行转换,
from selenium.webdriver.chrome.options import Options
from seleniumwire import webdriver
from selenium.webdriver.support.wait import WebDriverWait # 显示等待
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup # 解析网页数据
import json
options = Options()
wd = webdriver.Chrome()
wd.get(train_url) # 子网页
WebDriverWait(wd, 30, 0.5).until(EC.presence_of_element_located((By.TAG_NAME, 'pre'))) # 显示等待,当
res = wd.page_source
soup = BeautifulSoup(res, "lxml")
for pre in soup.find_all("pre"):
data = pre.text # 获取得到的数据是str类型的
mydict = json.loads(data.split("(", 1)[1].rsplit(")", 1)[0]) # 将字符串转换成字典
result=mydict['data']["trains"] # 一个网页中的所有信息 # 可以通过debug查看想要的数据
以上内容就是我在爬取做项目内容时遇到的问题的解决。