scrapy特性就是效率高,异步,如果非要集成selenium实际上意义不是特别大....因为selenium慢....

案例:淘宝首页推荐商品的标题获取

爬虫类 toabao.py

import scrapy
from scrapy.http import HtmlResponse
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule, Spider class TaobaoSpider(Spider):
name = "tb"
allowed_domains = ["taobao.com"]
start_urls = ["https://taobao.com"] def parse(self, response: HtmlResponse, **kwargs): # with open("tb.html", "w", encoding="utf-8") as f:
# f.write(response.text) # 由于自己编写的Selenium中间件的存在,response返回的数据是selenium返回的。 selector_list = response.xpath('//div[@class="tb-recommend-content-item"]')
for selector in selector_list:
title = selector.xpath('./a/div[@class="info-wrapper"]/div[@class="title"]/text()').get()
print(f"{title=}")

settings.py

# 把一些配置放到settings中,方便修改
##### Selenium集成配置 #####
DIRVER_PATH = r'C:\Users\Administrator\Desktop\chromedriver.exe'
# 跳过selenium检测
STEALTH_JS = r'C:\Users\Administrator\Desktop\stealth.min.js' DOWNLOADER_MIDDLEWARES = {
# 启用下载器中间件
"scrapy_demo.middlewares.SeleniumDownLoaderMiddleware": 543,
}

SeleniumMiddleware.py 下载器中间件

class SeleniumDownLoaderMiddleware:

    @classmethod
def from_crawler(cls, crawler):
# This method is used by Scrapy to create your spiders. dirver_path = crawler.settings["DIRVER_PATH"]
stealth_js = crawler.settings["STEALTH_JS"] # 这个类方法就是实例化中间件自己本身。
s = cls(dirver_path=dirver_path, stealth_js=stealth_js) crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s def __init__(self, dirver_path, stealth_js, *args, **kwargs):
# 获取配置
# settings = get_project_settings()
# 加载读懂
# service = ChromeService(executable_path=settings["DIRVER_PATH"])
service = ChromeService(executable_path=dirver_path) # 设置浏览器选项
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features")
options.add_argument("--disable-blink-features=AutomationControlled") # 接管现有的浏览器
options.add_experimental_option("debuggerAddress", "127.0.0.1:9333") # 实例化浏览器
self.driver = webdriver.Chrome(service=service, options=options) # 防检测selenium
# with open(settings["STEALTH_JS"]) as f:
with open(stealth_js) as f:
js = f.read()
self.driver.execute_cdp_cmd(
cmd="Page.addScriptToEvaluateOnNewDocument",
cmd_args={
"source": js
}
)
# 显示等待5秒
self.driver.implicitly_wait(5) def __del__(self):
self.driver.quit() def process_request(self, request, spider):
# Called for each request that goes through the downloader
# middleware. # Must either:
# - return None: continue processing this request
# - or return a Response object
# - or return a Request object
# - or raise IgnoreRequest: process_exception() methods of
# installed downloader middleware will be called # 打开url
self.driver.get(request.url)
# self.driver.get(
# "https://s.taobao.com/search?commend=all&ie=utf8&initiative_id=tbindexz_20170306&page=1&q=%E9%9B%B6%E9%A3%9F&search_type=item&sourceId=tb.index&spm=a21bo.jianhua.201856-taobao-item.2&ssid=s5-e") #### 模拟各种操作....
# self.driver.find_element(By.PARTIAL_LINK_TEXT, "天猫超").click()
# self.driver.switch_to.window(self.driver.window_handles[-1])
"""
1、先获取当前的高度
2、进入死循环
2-1、滚动到最底部
2-2、判断当前高度是否比上一次高度大,
如果是表示底部还有数据,
更新当前高度的值,用于下次比较
否则已经到了底部了
"""
# 自动滚动获取新数据
self.load_data_by_scroll(self.driver) # 看看效果
# time.sleep(5) # 返回响应。
return HtmlResponse(url=request.url, body=self.driver.page_source, request=request, encoding="utf-8", status=200) def load_data_by_scroll(self, driver: WebDriver):
js = 'return document.body.scrollHeight;'
# 获取当前高度
check_height = driver.execute_script(js)
while True:
# 先滚动到最底部,如果能继续加载更新,那么document.body.scrollHeight的值就会变大
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
try:
# 判断当前的document.body.scrollHeight是否比原来的大
# 这里巧妙利用WebDriverWait,until只要拿不到返回值然后超过给定的时间(5秒)后就会发生TimeoutException异常
# 发生异常就是表示已经没有更多数据了,那么直接跳出死循环
WebDriverWait(driver, 5, 0.2).until(lambda x: x.execute_script(js) > check_height)
# 更新值,用于下次比较
check_height = driver.execute_script(js)
except Exception as e:
break def process_response(self, request, response, spider):
# Called with the response returned from the downloader. # Must either;
# - return a Response object
# - return a Request object
# - or raise IgnoreRequest
return response def process_exception(self, request, exception, spider):
# Called when a download handler or a process_request()
# (from other downloader middleware) raises an exception. # Must either:
# - return None: continue processing this exception
# - return a Response object: stops process_exception() chain
# - return a Request object: stops process_exception() chain
pass def spider_opened(self, spider):
spider.logger.info("Spider opened: %s" % spider.name)

Scrapy集成selenium-案例-淘宝首页推荐商品获取的更多相关文章

  1. 模仿淘宝首页写的高仿页面,脚本全用的原生JS,菜鸟一枚高手看了勿喷哈

    自己仿照淘宝首页写的页面,仿真度自己感觉可以.JS脚本全是用原生JavaScript写得,没用框架.高手看了勿喷,请多多指正哈!先上网页截图看看效果,然后上源码: 上源码,先JavaScript : ...

  2. Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片

    Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片 自定义ADPager 自定义水平滚动的ScrollView效仿ViewPager 当遇到要在Vie ...

  3. 淘宝首页源码藏美女彩蛋(下)(UED新作2013egg)

    我们已经知道,执行美女会得到"彩蛋",而正是彩蛋做到了taobaoUED展现给大家的神奇的前端魅力.今天我们来看看FP.egg&&FP.egg("%cjo ...

  4. js实现淘宝首页图片轮播效果

    原文:http://ce.sysu.edu.cn/hope2008/Education/ShowArticle.asp?ArticleID=10585 <!DOCTYPE html> &l ...

  5. 【angularjs】使用angularjs模拟淘宝首页-淘宝头条滚动效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. selenium实现淘宝的商品爬取

    一.问题 本次利用selenium自动化测试,完成对淘宝的爬取,这样可以避免一些反爬的措施,也是一种爬虫常用的手段.本次实战的难点: 1.如何利用selenium绕过淘宝的登录界面 2.获取淘宝的页面 ...

  7. Jsp调用淘宝IP地址库获取来访IP详细信息

    Jsp调用淘宝IP地址库获取来访IP详细信息   示例网页点击:www.trembler.cn/ipinfo/ipinfo(服务器有其他用处,页面已失效) String ip = request.ge ...

  8. TP5+阿里云OSS上传文件第三节,实现淘宝上传商品图片

    **TP5+阿里云OSS上传文件第三节,实现淘宝上传商品图片首先我们来看看淘宝的功能和样式:** 之后看看制作完成的演示:(由于全部功能弄成GIF有点大,限制上传大小好像在1M之内,压缩之后也有1.9 ...

  9. 使用scrapy爬虫,爬取今日头条首页推荐新闻(scrapy+selenium+PhantomJS)

    爬取今日头条https://www.toutiao.com/首页推荐的新闻,打开网址得到如下界面 查看源代码你会发现 全是js代码,说明今日头条的内容是通过js动态生成的. 用火狐浏览器F12查看得知 ...

  10. 爬虫实战【8】Selenium解析淘宝宝贝-获取多个页面

    作为全民购物网站的淘宝是在学习爬虫过程中不可避免要打交道的一个网站,而是淘宝上的数据真的很多,只要我们指定关键字,将会出现成千上万条数据. 今天我们来讲一下如何从淘宝上获取某一类宝贝的信息,比如今天我 ...

随机推荐

  1. CodeForces 1332E Height All the Same

    题意 对于一个\(n*m\)的矩阵,有两种操作 一个格子加二 一个格子和另一个相邻的格子同时加一 通过这两种操作最终使得所有矩阵元素相等 对于矩阵元素来说,有\(L\leq a_{i,j}\leq R ...

  2. DesignPattern-part3

    title: "modern C++ DesignPattern-Part3" date: 2018-04-12T19:08:49+08:00 lastmod: 2018-04-1 ...

  3. Solidity-变量和数据类型[复合类型_1]

    复合类型的数据包括:array(数组).struct(结构体)和mapping(映射),其中array和struct也称为引用类型. 复合类型 数组(array) 数组(array)是一种用于存储相同 ...

  4. react18-webchat网页聊天实例|React Hooks+Arco Design仿微信桌面端

    React18 Hooks+Arco-Design+Zustand仿微信客户端聊天ReactWebchat. react18-webchat基于react18+vite4.x+arco-design+ ...

  5. Solution Set -「CSP-S 2020」

    Problem. 1 - Junior Julian 模拟模拟模拟摸死 CTR 的母. 考场代码: #include<cstdio> namespace solveIt { void re ...

  6. C++指针和地址偏移在HotSpot VM中的应用

    在前面我们介绍过new运算符,这个操作实际上上包含了如下3个步骤: 调用operator new的标准库函数.此函数会分配一块内存空间以便函存储相应类型的实例. 调用相应类的构造函数 返回一个指向该对 ...

  7. Github 组合搜索开源项目 (超详细)

    例如搜索 Spring Boot 相关项目  spring boot (最简单最常用) in:name spring boot (匹配项目名字)  in:name spring boot stars: ...

  8. SQL函数count(),sum()理解

    ①准备-创建测试表: create table test ( id SMALLINT, name varchar(10) ); 插入数据: insert into test values(0,'张三' ...

  9. 其它——ASCII码,Unicode和UTF-8编码

    文章目录 一 ASCII码 二 非ASCII编码 三 Unicode 3.1 Unicode存在的问题 3.2 它们造成的结果是 四 UTF-8 4.1 UTF-8 特点 4.2 UTF-8 的编码规 ...

  10. Kafka的零拷贝技术Zero-Copy

    传统的拷贝过程 流程步骤: (1)操作系统将数据从磁盘文件中读取到内核空间的页面缓存: (2)应用程序将数据从内核空间读入用户空间缓冲区: (3)应用程序将读到数据写回内核空间并放入socket缓冲区 ...