selenium嵌入scrapy动态网页抓取

selenium的基本信息

基本定义:

  • Selenium 的核心目标是通过编程控制浏览器来实现 Web 测试和自动化任务,无需手动操作。
  • Selenium 的核心是通过 WebDriver 驱动浏览器,遵循 W3C WebDriver 协议实现自动化。这使其能模拟用户行为,例如打开网址、输入文本、执行点击操作。
  • Selenium 最初设计用于 Web 测试(如回归测试),但现在已广泛应用于数据抓取、UI 自动化脚本等领域。

安装虚拟环境:

python 复制代码
pip install selenium

文档

  • selenium python api

动态网页数据的提取

  • 如果查看源代码的数据,会发现在源代码中没有数据,数据是使用动态加载完成的,所以对于动态加载的网页,必须使用browser.page_source 获取加载过后的网页才能获取到数据。

代码

python 复制代码
from selenium import webdriver

browser = webdriver.Chrome()
browser.get("https://detail.tmall.com/item.html?")
print(browser.page_source)
browser.quit()#退出浏览器
html 复制代码
<html lang="en" style="height:100%;"><head>
    <meta charset="utf-8">
    <meta name="robots" content="noodp, noydir">
    <meta name="eagleeye-trace" content="215041f517676127023577655eee13">
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate">
    <meta http-equiv="Pragma" content="no-cache">
    <meta http-equiv="Expires" content="-1">
    <meta name="data-spm" content="a212t0">
    <link rel="dns-prefetch" href="//ynuf.alipay.com">
    <link rel="dns-prefetch" href="//ynuf.aliapp.org">
    <link rel="dns-prefetch" href="//cf.aliyun.com">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0">
                        <meta name="description" content="taobao.com">
                <title>登录</title>

            <link href="https://gw.alicdn.com/tps/i2/TB1nmqyFFXXXXcQbFXXE5jB3XXX-114-114.png" rel="apple-touch-icon-precomposed">
        <link rel="shortcut icon" href="https://gw.alicdn.com/tps/i2/TB1nmqyFFXXXXcQbFXXE5jB3XXX-114-114.png" type="image/x-icon">
    
            <link href="https://g.alicdn.com/vip/havana-nlogin/0.10.31/index.css" rel="stylesheet" type="text/css">
    
                        <link rel="stylesheet" href="https://g.alicdn.com/vip/biz-assets/0.2.68/assets/taobao_pc_width_login_new.css">
                <script>
                                            window.enableWwSsoPluginLogin = true;
                                </script></head></html>

获取动态网页上的数据

  • 正常情况下可以使用:
python 复制代码
text = browser.find_element(By.XPATH,"")
  • 但是由于selenium获取数据的速度比较慢,如果在scrapy爬虫框架中需要获取数据可以使用Selector。
python 复制代码
from selenium import webdriver
from scrapy.selector import Selector

browser = webdriver.Chrome()
browser.get("")
print(browser.page_source)
t_selector = Selector(text=browser.page_source)
t_selector.css("")
browser.quit()

模拟登录知乎

python 复制代码
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
browser = webdriver.Chrome()
browser.get("https://www.zhihu.com/signin?")
browser.switch_to.frame('frame_name')
mima_click = browser.find_element(By.XPATH,'//div[@class="SignFlow-tabs"]/div[2]')
username = browser.find_element(By.XPATH, '//form/div[@class="SignFlow-account"]//input')
username.send_keys("")
password = browser.find_element(By.XPATH, '//form/div[@class="SignFlow-password"]//input')
password.send_keys("")
browser.find_element(By.XPATH, "//form/button").click()

input("回车继续:")

time.sleep(4)
browser.refresh()   #刷新网页
time.sleep(4)
cookie = browser.get_cookies()  #获取cookie信息
if cookie:
    print(cookie)
else :
    print(cookie= list())
print(cookie)

模拟鼠标下拉

python 复制代码
from selenium import webdriver
import time

browser = webdriver.Chrome()
browser.get("https://www.oschina.net/blog/")
for i in range(3):
    browser.execute_script("window.scrollTo(0,document.body.scrollHeight);var lenOfPage=document.body.scrollHieght;return lenOfPage;")
    time.sleep(3)
print(browser.page_source)

不加载图片

python 复制代码
from selenium import webdriver
import time


chrome_options = webdriver.ChromeOptions()
prefs = {"profile.managed_default_content_settings.images": 2}
chrome_options.add_experimental_option("prefs", prefs)
browser = webdriver.Chrome(options=chrome_options)
browser.get("https://www.oschina.net/blog/")
time.sleep(5)
print(browser.page_source)

phantomjs获取动态页面

phantomjs,无界面的浏览器,多进程情况下phantomjs性能会下降很快

python 复制代码
from selenium import webdriver
 
url = "https://example.com"
 path_PhantomJS = ""
driver = webdriver.PhantomJS(excutable_path = path_PhantomJS)
driver.get(url)
 
print(driver.page_source.encode("utf-8"))

selenium集成到scrapy中

  • 打开下载器中间件
python 复制代码
DOWNLOADER_MIDDLEWARES = {
    'ArticleSpider.middlewares.JSPageMiddleware': 1,
}
  • 在中间件中创建
python 复制代码
from selenium import webdriver
from scrapy.http import HtmlResponse
class JSPageMiddleware(object):
    #通过chrome请求动态网页
    def process_request(self, request, spider):
        if spider.name == "爬虫名":
        		 #创建browser。如果在这里创建,那么每经过一次,就会创建一次
            # browser = webdriver.Chrome(executable_path="D:/Temp/chromedriver.exe")
            spider.browser.get(request.url)
            import time
            time.sleep(3)
            #查看访问的网址
            print ("访问:{0}".format(request.url))

            callback = request.callback
            #HtmlResponse()的作用:数据流经过这一步,数据不会进入下载器,而是直接返回给爬虫
            #encoding="utf-8":这里的encoding需要注意,并不是所有的页面都是阿斯克码需要自己去判断
            return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding="utf-8", request=request)
  • 为了防止数据流每经过一次中间件,浏览器就启动一次,将创建放入spiderzhong
python 复制代码
from pydispatch import dispatcher
from scrapy import signals
#可以用spider_opened: 爬虫下载器中间件替代
def __init__(self):
	self.browser = webdriver.Chrome()
	super(爬虫Spider,self).__init__()
	#信号量
	dispatcher.connect(self.handle_spider_closed, signals.spider_closed)

def spider_closed(self,spider):
	#当爬虫退出的时候关闭browser
	print("spider closed")
	self.browser.quit()

注意:由于在中间件中使用了selenium,所以不是异步的了,为了保证异步执行,可以使用scrapy-splash,或者使用selenium-grid

相关推荐
测试工程师成长之路36 分钟前
Serenity BDD 框架:Java + Selenium 全面指南(2026 最新)
java·开发语言·selenium
may_一一37 分钟前
xpath定位:selenium和playwrightAnt Design / 表单类页面)
selenium·测试工具
daopuyun1 小时前
CNAS/CMA软件检测实验室源代码漏洞测试工具选型要求与比对
软件测试·测试工具·软件检测·cnas认可·cma认定
Wpa.wk3 小时前
接口自动化测试 - 请求构造和响应断言 -Rest-assure
开发语言·python·测试工具·接口自动化
AI_56784 小时前
Postman接口测试提速技巧:批量请求+智能断言实践
测试工具·lua·postman
Luminbox紫创测控6 小时前
整车自然暴晒与全光谱阳光模拟老化相关性研究
测试工具
泡泡以安8 小时前
Scrapy分布式爬虫调度器架构设计说明
分布式·爬虫·scrapy·调度器
弹简特9 小时前
【JavaEE06-后端部分】SpringMVC01-Spring MVC第一大核心URL 路由映射【建立连接】与 Postman 接口测试详解
java·spring boot·测试工具·spring·postman
0思必得021 小时前
[Web自动化] Selenium设置相关执行文件路径
前端·爬虫·python·selenium·自动化