Scrapy集成selenium-案例-淘宝首页推荐商品获取
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-案例-淘宝首页推荐商品获取的更多相关文章
- 模仿淘宝首页写的高仿页面,脚本全用的原生JS,菜鸟一枚高手看了勿喷哈
自己仿照淘宝首页写的页面,仿真度自己感觉可以.JS脚本全是用原生JavaScript写得,没用框架.高手看了勿喷,请多多指正哈!先上网页截图看看效果,然后上源码: 上源码,先JavaScript : ...
- Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片
Android中仿淘宝首页顶部滚动自定义HorizontalScrollView定时水平自动切换图片 自定义ADPager 自定义水平滚动的ScrollView效仿ViewPager 当遇到要在Vie ...
- 淘宝首页源码藏美女彩蛋(下)(UED新作2013egg)
我们已经知道,执行美女会得到"彩蛋",而正是彩蛋做到了taobaoUED展现给大家的神奇的前端魅力.今天我们来看看FP.egg&&FP.egg("%cjo ...
- js实现淘宝首页图片轮播效果
原文:http://ce.sysu.edu.cn/hope2008/Education/ShowArticle.asp?ArticleID=10585 <!DOCTYPE html> &l ...
- 【angularjs】使用angularjs模拟淘宝首页-淘宝头条滚动效果
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- selenium实现淘宝的商品爬取
一.问题 本次利用selenium自动化测试,完成对淘宝的爬取,这样可以避免一些反爬的措施,也是一种爬虫常用的手段.本次实战的难点: 1.如何利用selenium绕过淘宝的登录界面 2.获取淘宝的页面 ...
- Jsp调用淘宝IP地址库获取来访IP详细信息
Jsp调用淘宝IP地址库获取来访IP详细信息 示例网页点击:www.trembler.cn/ipinfo/ipinfo(服务器有其他用处,页面已失效) String ip = request.ge ...
- TP5+阿里云OSS上传文件第三节,实现淘宝上传商品图片
**TP5+阿里云OSS上传文件第三节,实现淘宝上传商品图片首先我们来看看淘宝的功能和样式:** 之后看看制作完成的演示:(由于全部功能弄成GIF有点大,限制上传大小好像在1M之内,压缩之后也有1.9 ...
- 使用scrapy爬虫,爬取今日头条首页推荐新闻(scrapy+selenium+PhantomJS)
爬取今日头条https://www.toutiao.com/首页推荐的新闻,打开网址得到如下界面 查看源代码你会发现 全是js代码,说明今日头条的内容是通过js动态生成的. 用火狐浏览器F12查看得知 ...
- 爬虫实战【8】Selenium解析淘宝宝贝-获取多个页面
作为全民购物网站的淘宝是在学习爬虫过程中不可避免要打交道的一个网站,而是淘宝上的数据真的很多,只要我们指定关键字,将会出现成千上万条数据. 今天我们来讲一下如何从淘宝上获取某一类宝贝的信息,比如今天我 ...
随机推荐
- PC首页资源加载速度由8s降到2s的优化实践
随着需求的不断开发,前端项目不断膨胀,业务提出:你们的首页加载也太慢啦,我都需要7.8秒才能看到内容,于是乎主管就让我联合后端开启优化专项,目标是3s内展示完全首页的内容. 性能指标 开启优化时,我们 ...
- mpi转以太网连接300PLC与施耐德 Quantum PLC 通讯
S7300 PLC转以太网无需编程与施耐德 Quantum PLC modbusTCP通信 方案介绍: 西门子300PLC转以太网不需要编写程序通过兴达易控MPI-ETH-XD1.0与施耐德 Quan ...
- Docker Swarm + Harbor + Portainer 打造高可用,高伸缩,集群自动化部署,更新。
Docker Swarm是Docker官方自带的容器编排工具,Swarm,Compose,Machine合称Docker三剑客.Docker Swarm对于中小型应用来说,还是比较方便,灵活,当然K8 ...
- c++ 常用的 STL
c++ 中常用的 STL vector //vector 变长数组 倍增的思想(倍增:系统为每一个程序分配空间的时候,所需要的时间和空间大小无关,与请求次数相关)尽量减少请求的次数 /* 返回元素的个 ...
- python制作定时发送信息脚本
文章中提到的菜单是右下角这个 需求 我们需要做到打开微信获取输入框焦点及输入 思路 1,获取到右下角菜单的坐标和菜单中微信的坐标以及输入框的坐标 2,定时,用time.sleep()来定义多长时间后触 ...
- JNI编程之字符串处理
java中的字符串类型是String,对应的jni类型是jstring,由于jstring是引用类型,所以我们不能像基本数据类型那样去使用它,我们需要使用JNIEnv中的函数去处理jstring,下面 ...
- CF1368B
题目简化和分析: 因为要求长度最小,所以我们每个字符就应该发挥最大的价值,不会有没有作用的字符. 设有 \(x_1\) 个 \(c\) ,\(x_2\) 个 \(o\) ,\(x_3\) 个 \(d\ ...
- STL 迭代器
工作之余看了一下<<accelerated c++>>这本书,挺有意思没,没有一大堆概念,直接就开始一步一步编写代码. 书中时不时会涉及到一些stl的概念,比如容器,算法,迭代 ...
- Vue之事件冒泡
1. 原生事件冒泡 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- Redis7
Redis是基于内存的K-V键值对内存数据库 浅谈Redis7新特性 主要是自身底层性能和资源利用率上的提高和优化. 多AOF文件支持 config命令增强 限制客户端内存使用 listpack紧凑列 ...