Scrapy和Selenium整合(一文搞定)

这篇具有很好参考价值的文章主要介绍了Scrapy和Selenium整合(一文搞定)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

scrapy和selenium的整合使用
先定个小目标实现万物皆可爬!我们是用scrapy框架来快速爬取页面上的数据,它是自带并发的,速度是可以的。但是一些ajax异步的请求我们不能这么爬取。我们要视同selenium来进行lazy loading,也就是懒加载,渲染到页面加载数据。


一、开始准备

Scrapy和Selenium整合(一文搞定)

1. 包管理和安装chrome驱动

首先你要安装以下包:

pip install scrapy
pip install selenium == 3.0.0
pip install pymysql
pip install bs4
  • selenium新版本有bug,用3.0的版本。
  • chrome驱动的exe执行文件,放到你项目的根目录即可。下载地址:驱动

2. 爬虫项目的创建(举个栗子)

  1. 创建项目
scrapy startproject cnki
  1. 您爬取的目标网站
scrapy genspider cnki https://www.cnki.net
  1. 运行爬虫
# 运行不导出(一般在pipelines做导出操作)
scrapy crawl cnki
# 针对不同的选择可以导出为xlsx、json等格式文件
scrapy crawl demo -o demo.csv

3. setting.py的配置

  1. 配置数据源,如下:
DB_HOST = 'localhost'
DB_PORT = 3306
DB_USER = 'root'
DB_PASSWORD ='123456'
DB_DATABASE = 'spider'
  1. 防止打印log日志信息
LOG_LEVEL = 'WARNING'
  1. 配置USER_AGENT(浏览器控制台找一个)
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36
  1. 配置DEFAULT_REQUEST_HEADERS(浏览器控制台找一个)
{
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36',
 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
 'Accept-Language': 'en',
}
  1. 随机延迟
DOWNLOAD_DELAY = 3
RANDOMIZE_DOWNLOAD_DELAY=True
  1. 中间件权重配置(这些中间件给他打开 并且按照项目实际需求配置权重,越小越先执行)
SPIDER_MIDDLEWARES # 蜘蛛中间件
DOWNLOADER_MIDDLEWARES # 下载中间件
ITEM_PIPELINES # 管道

二、代码演示

1. 主爬虫程序

  1. 初始化selenium (如果您不需要selenium,可以忽略这个
def __init__(self, *args,**kwargs):
    option = webdriver.ChromeOptions()  # 实例化一个浏览器对象
    option.add_argument('--headless')  # 添加参数,option可以是headless,--headless,-headless
    self.driver = webdriver.Chrome(options=option)  # 创建一个无头浏览器
    # self.driver = webdriver.Chrome()  # 创建一个无头浏览器
    time.sleep(3)
    super(CnkiSpider, self).__init__(*args, **kwargs)
    dispatcher.connect(self.close_driver,signals.spider_closed)
  1. 定义开始请求页面
    下面我只放了一个url,其实可以定义一组的然后进行遍历(一般是分页url使用)
    还有cookie、代理也可以在这里配置,详情请看进去看源码
    (不过一般在中间件配置)
def start_requests(self):
    for url in self.start_urls:
    	yield scrapy.Request(
                # 这里可以设置多个页面,一般用于分页的
                url=url,
            )
  1. 关闭selenium(一定要关掉)
def close_driver(self):
    print("爬虫正在退出,执行关闭浏览器哦")
    time.sleep(2)
    self.driver.quit()
  1. 解析页面
    这里就不多说,八仙过海各显神通
def parse(self,response: HtmlResponse):
sel = Selector(response)
dds = sel.css('.journal > .main-w1 > dl > dd')
for dd in dds:
	title = dd.css('h6 > a::attr(title)').extract_first()
    link = dd.css('h6 > a::attr(href)').extract_first()
    link = response.urljoin(link)
    author = dd.css('.baseinfo > span > #author::attr(title)').extract_first()
    abstract = dd.css('.abstract::text').extract_first()
    count = dd.css('.opts > .opts-count > li > em::text').extract_first()
    count = int(count)
    date = dd.css('.opts > .opts-count > .date::text').extract_first()
    date = date.split(':')[1]
    date = datetime.datetime.strptime(date,"%Y-%m-%d")
    rc = Recommend()
    rc['title'] = title
    rc['link'] = link
    rc['author'] = author
    rc['abstract'] = abstract
    rc['count'] = count
    rc['date'] = date
    yield rc

这里要注意我们yield可以返回不仅是item,也可以是Request,进行页面详情的请求(套娃)

yield Request(
     url=link, # 这是上面页面上的链接,用来进一步请求
     callback=self.parse_detail, # 这是回调函数
     cb_kwargs={'item':rc} # 这是把上面的item传递下来
   )

2. 中间件的配置

  1. 针对selenium
    没有selenium请忽略
class SeleniumDownloaderMiddleware:
    def process_request(self, request , spider):
        if spider.name == 'cnki':
            spider.driver.get(request.url)
            time.sleep(2)
            print(f"当前访问{request.url}")
            spider.driver.refresh()
            time.sleep(3)
            return HtmlResponse(url=spider.driver.current_url,body=spider.driver.page_source,encoding='utf-8')
  1. SpiderMiddleware保持默认配置即可
  2. DownloaderMiddleware可以配置cookie和代理之类的。如:
# 我自定义的解析cookie方法
def get_cookie_dict():
    cookie_str = 填上你的cookie
    cookie_dict = {}
    for item in cookie_str.split(';'):
        key, value = item.split('=',maxsplit=1)
        cookie_dict[key] = value
    return cookie_dict
COOKIES_DICT = get_cookie_dict()
	# 这是DownloaderMiddleware这是自带的方法哈
def process_request(self, request : Request, spider):
    request.cookies = COOKIES_DICT
    return None

3. 定义item对象

用来接受爬虫到的数据

class Recommend(scrapy.Item):
    title = scrapy.Field()
    author = scrapy.Field()
    abstract = scrapy.Field()
    link = scrapy.Field()
    count = scrapy.Field()
    date = scrapy.Field()

4. 定义管道

实现对数据库的导入(你也可以写excel的)

class RecommendPipeline:
    @classmethod
    def from_crawler(cls, crawler: Crawler):
        host = crawler.settings['DB_HOST']
        port = crawler.settings['DB_PORT']
        username = crawler.settings['DB_USER']
        password = crawler.settings['DB_PASSWORD']
        database = crawler.settings['DB_DATABASE']
        return cls(host, port, username, password, database)

    def __init__(self, host, port, username, password, database):
        # 1、与数据库建立连接
        self.conn = pymysql.connect(host=host, port=port, user=username, password=password, database=database,
                                    charset='utf8mb4')
        # 2、创建游标
        self.cursor = self.conn.cursor()

        # 3、批处理需要的容器
        self.data = []

    def process_item(self, item, spider):
        title = item.get('title', '')
        author = item.get('author', '')
        abstract = item.get('abstract', '')
        link = item.get('link', '')
        count = item.get('count', '')
        date = item.get('date', '')
        # 如果要实现批处理:
        self.data.append((title,author,abstract,link,count,date))
        # 如果存够了10条就进数据库
        if len(self.data) == 10:
            self._to_write_db()
            # 然后再清空
            self.data.clear()
        return item

    def close_spider(self, spider):
        # 如果最后不满足10条
        if len(self.data) > 0:
            self._to_write_db()
        self.conn.close()

    def _to_write_db(self):
        # 作为一个实时的推荐,我希望将查到的数据作为一个temp
        # 'delete from tb_recommend where 1 = 1' 删除满,并且主键自增不会从1开始
        self.cursor.execute(
            'truncate table tb_recommend'
        )
        self.cursor.executemany(
            'insert into tb_recommend (title,author,abstract,link,count,date) values (%s, %s, %s, %s, %s, %s)',
            self.data
        )
        self.conn.commit()

记得写入setting.py,设置其权重。
*接下来您就可以按照这种方法‘愉’ ‘快’的进行爬虫啦!!! *

总结

这是scrapy和selenium的具体整合使用,scrapy框架的内容还有很多方法还没用到,都有待开发。其次就是selenium的填充之类的操作还没有使用,还需要去复习selenium的api。文章来源地址https://www.toymoban.com/news/detail-442309.html

到了这里,关于Scrapy和Selenium整合(一文搞定)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Scrapy框架集成Selenium实现高效爬虫

    在网络爬虫的开发中,有时候我们需要处理一些JavaScript动态生成的内容或进行一些复杂的操作,这时候传统的基于请求和响应的爬虫框架就显得力不从心了。为了解决这个问题,我们可以使用Scrapy框架集成Selenium来实现高效的爬虫。 Scrapy是一个使用Python编写的开源网络爬虫框

    2024年02月09日
    浏览(47)
  • 用Scrapy和Selenium爬取动态数据

    文章参考千锋教育大佬的课程: https://www.bilibili.com/video/BV1QY411F7Vt?p=1vd_source=5f425e0074a7f92921f53ab87712357b ,多谢大佬的课程   因为TB网的搜索功能需要登录之后才能使用,所以我们要通过程序去控制浏览器实现登录功能,然后再获取登录之后的Cookie.   首先创建一个Chrome浏览

    2024年02月02日
    浏览(42)
  • 在scrapy 使用selenium模拟登录获取cookie

    前言 最近有一点点爬虫需求,想总结一下scrapy框架的一些基本使用方法,加深印象,自己一直习惯使用一些脚本文件运行爬虫,面对数据量非常大,稳定性要求比较高的,效率需求比较高的情况下还是用scrapy较为合适,scrapy是一个异步的框架,所有的请求都是阻塞的,虽然在

    2024年02月11日
    浏览(62)
  • Scrapy爬虫框架集成Selenium来解析动态网页

    当前网站普遍采用了javascript 动态页面,特别是vue与react的普及,使用scrapy框架定位动态网页元素十分困难,而selenium是最流行的浏览器自动化工具,可以模拟浏览器来操作网页,解析元素,执行动作,可以处理动态网页,使用selenium处理1个大型网站,速度很慢,而且非常耗资

    2024年02月15日
    浏览(53)
  • python爬虫实战 scrapy+selenium爬取动态网页

    最近学习了scrapy爬虫框架,想要找个目标练练手。由于现在很多网页都是动态的,因此还需要配合selenium爬取。本文旨在记录这次学习经历,如有疑问或不当之处,可以在评论区指出,一起学习。 对scrapy不了解的同学可以阅读这篇文章 爬虫框架 Scrapy 详解,对scrapy框架介绍的

    2024年02月07日
    浏览(83)
  • 爬虫学习 Scrapy中间件&代理&UA随机&selenium使用

    控制台操作 (百度只起个名 scrapy startproject mid scrapy genspider baidu baidu.com setting.py内 运行 scrapy crawl baidu middlewares.py 中间件 先看下载器中间件 重点在 process_request 在引擎将请求的信息交给下载器之前,自动的调用该方法 process_response… process_exception 异常 (看名就知道了…) spider

    2024年03月23日
    浏览(62)
  • 探索Scrapy中间件:自定义Selenium中间件实例解析

    Scrapy是一个强大的Python爬虫框架,可用于从网站上抓取数据。本教程将指导你创建自己的Scrapy爬虫。其中,中间件是其重要特性之一,允许开发者在爬取过程中拦截和处理请求与响应,实现个性化的爬虫行为。 本篇博客将深入探讨Scrapy中间件的关键作用,并以一个实例详细介

    2024年02月04日
    浏览(72)
  • 网络爬虫(Python:Selenium、Scrapy框架;爬虫与反爬虫笔记)

    Selenium是一个模拟浏览器浏览网页的工具,主要用于测试网站的自动化测试工具。 Selenium需要安装浏览器驱动,才能调用浏览器进行自动爬取或自动化测试,常见的包括Chrome、Firefox、IE、PhantomJS等浏览器。 注意:驱动下载解压后,置于Python的安装目录下;然后将Python的安装目

    2024年01月18日
    浏览(64)
  • Scrapy第十一(①)篇:selenium4模拟器中间件

    为什么要使用模拟器? 在使用request的时候,大型网站都有很多的反爬机制,典型比如滑动验证码、弹窗广告、弹窗验证、登录认证、Ajax异步加载...等等,这些是request很难绕过去的。这时候可以使用selenium模拟器来模拟用户操作:Selenium可以根据的指令,让浏览器自动加载页

    2024年02月08日
    浏览(53)
  • 使用 Scrapy 和 Selenium 爬取 Boss 直聘职位信息(可视化结果)

    在本博客中,我们将介绍如何使用 Scrapy 和 Selenium 来爬取 Boss 直聘 网站上的职位信息。Boss 直聘是一个广受欢迎的招聘平台,提供了大量的职位信息,以及公司和 HR 的联系信息。通过本文的指南,你将学会如何创建一个爬虫来抓取特定城市的 Python 职位信息。 在这个示例中,

    2024年02月08日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包