python爬虫实战 scrapy+selenium爬取动态网页

这篇具有很好参考价值的文章主要介绍了python爬虫实战 scrapy+selenium爬取动态网页。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

scrapy与selenium

对scrapy不了解的同学可以阅读这篇文章 爬虫框架 Scrapy 详解,对scrapy框架介绍的非常详尽。

Selenium简单来说就是一种用于测试Web应用程序的自动化工具。它可以模拟用户在浏览器中的各种操作,如点击、输入、选择、拖放等,以及对页面进行断言验证。在这里可以帮助我们获取到动态网页的数据。

准备工作

相关库以及chromedriver的安装

我们需要安装两个库,一个是selenium库,还有一个是scrapy库。

pip install selenium // 安装selenium库
pip install scrapy   // 安装scrapy库

除此之外,还需要安装chromedriver.exe,如果电脑上没有谷歌浏览器就还需要安装谷歌浏览器。chromedriver.exe的安装可以看我的这篇文章python爬虫学习日志 使用selenium爬取动态网页数据

目标内容

获取某站目标视频的标题、播放量、发布日期、时长、点赞量、投币量、收藏量。
由于版权问题这里不能放出相应视频的图片,各位如有需要可以自行了解。

具体实现

准备工作完成之后就可以开始编写我们的代码啦~

创建项目

打开pycharm的终端或者cmd窗口,进入想要放置爬虫文件的目录,我这里是直接在pycharm的项目目录里创建的,然后输入以下命令

scrapy startproject bili //bili是自定义的爬虫项目名称

如果返回了以下信息,说明项目创建成功了。
python爬虫实战 scrapy+selenium爬取动态网页
然后我们就可以在pycharm左侧的文件栏看到我们创建的爬虫项目里的文件了。
python爬虫实战 scrapy+selenium爬取动态网页
创建之后,我们需要把下载的chromedriver.exe文件移至和scrapy.cfg同目录下,如图所示。
python爬虫实战 scrapy+selenium爬取动态网页

编写items.py文件

items.py文件是用来定义我们需要爬取的数据的,首先编辑它可以帮我们完成数据建模,之后按照items.py中的变量来匹配我们的数据就行了。

import scrapy


class BiliItem(scrapy.Item):
    // define the fields for your item here like:
    // name = scrapy.Field() 
    // 这是scrapy提供给我们建模的格式,按照这个来就行
    title = scrapy.Field() //视频标题
    play = scrapy.Field() // 播放量
    dianzan = scrapy.Field() //点赞量
    toubi = scrapy.Field() //投币量
    shoucang = scrapy.Field() //收藏量
    date = scrapy.Field() //发布日期
    time = scrapy.Field() //视频时长

这样一来,我们的items.py就文件就算编写完成了。

编写middlewares.py文件

接下来编写middlewares.py文件,也就是中间件。
中间件包括两种中间件,一种是爬虫中间件,还有一种是下载器中间件,每种中间件都有自己对应的功能,这里不再展开讲,想要了解的同学可以自己去查找相关信息。在这次实战中我们只需要通过编写下载器中间件对接selenium实现获取动态网页的源码这一功能。
代码如下:

from scrapy import signals
from selenium import webdriver
from scrapy.http import HtmlResponse

// 只需要修改下载器中间件,爬虫中间件不用管
class BiliDownloaderMiddleware:
	// 当下载器中间件开始工作时,自动打开一个浏览器
    def __init__(self):
        self.driver = webdriver.Chrome()

    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        // 下面这一行需要手动添加,作用是调用关闭浏览器的函数
        crawler.signals.connect(s.spider_closed, signal=signals.spider_closed)
        return s
        
    // 每当爬虫文件向目标网址发送一次请求都会调用这个函数,用处就是返回该网址的源码
    def process_request(self, request, spider):
        self.driver.get(request.url)  // 使用浏览器打开请求的URL
        body = self.driver.page_source  // 获取网页HTML源码
        return HtmlResponse(url=self.driver.current_url, body=body, encoding='utf-8', request=request)

    def process_response(self, request, response, spider):
        return response

    def process_exception(self, request, exception, spider):
        pass

    def spider_opened(self, spider):
        spider.logger.info("Spider opened: %s" % spider.name)

	// 该函数需要手动添加,作用是关闭浏览器
    def spider_closed(self, spider):
        self.driver.close()
        spider.logger.info("Spider closed: %s" % spider.name)

编写爬虫文件

完成了中间件的编写之后就可以开始编写我们的爬虫文件了。爬虫文件需要我们手动创建。具体流程是在spiders目录下新建一个.py文件,文件名可以自拟。
python爬虫实战 scrapy+selenium爬取动态网页
创建之后,就可以编写爬虫文件了。代码如下

// 使用哪种解析库可以根据自己的习惯选择,只要能获得目标数据就行
import scrapy
from bs4 import BeautifulSoup
// 这里需要导入之前编写的items.py文件中的BiliItem类,[..]表示上一目录
from ..items import BiliItem  
import re
from lxml import etree


class bilibili(scrapy.Spider): // 类名自拟,但是一定要在括号里写scrapy.Spider表示继承父类
    name = 'bilibili' // 爬虫名,自拟
    allowed_domains = ['space.bilibili.com'] // 定义域名,相当于是给爬虫规定了爬取的范围
    start_urls = ['https://space.bilibili.com/1629347259/video'] // 定义开始爬取的网页
    page = 1 // 如果想要爬取多页数据,需要定义爬取初始的页数,这里是1
    // 后续页数的网址,需要自己观察翻页后网址的变化得出规律
    base_url = 'https://space.bilibili.com/1629347259/video?tid=0&page={}'

	// 重写父类方法,解析相应网页
    def parse(self, response, **kwargs):
    	// 这里的response是下载器中间件返回给爬虫的网页源码,对此进行解析即可获得想要的数据
    	// 以下内容都是根据相应的网页源码选择合适的方法进行数据的提取,可以根据自己的需求编写。
        bs = BeautifulSoup(response.text, 'lxml')
        // tag_list是一个包括了很多个tag标签的列表,每个tag标签中都有视频的网址、标题、时长等数据
        tag_list = bs.select('#submit-video-list > ul.clearfix.cube-list > li')
        // 遍历取出每个tag标签
        for index, j in enumerate(tag_list):
        	// 创建一个item实例,用于存储相应数据,它类似于字典
            item = BilibiliItem() 
            // 获得网址,但这个网址不完整
            video_url = j.a['href'] 
            // 获得视频标题文本
            video_title = j.find('a', class_='title').text 
            // 获得视频时长文本
            video_time = j.find('span', class_="length").text
            // 使用正则表达式把获得到的不完整的网址修改为正确的网址,之后可以进入这些网址再获取其他数据
            pattern = r'//'
            video_url = re.sub(pattern, 'https://', video_url)
            // 将标题和时长以键值对的形式写进item实例中。
            item['title'] = video_title
            item['time'] = video_time
            // 这里需要用yield将相应数据提交给引擎,由引擎分配后续工作
            // url=video_url表示会将视频的网址提交给引擎,引擎会把这个网址转交给中间件,中间件又会将相应源码提供给爬虫文件
            // callback表示获取到相应源码后会将它交给爬虫文件中哪个函数进行处理
            // meta={'item': item}的作用是把目前的item实例转移给下一个函数使用或编辑。
            // dont_fillter=True表示不过滤重复的请求。
            yield scrapy.Request(url=video_url, callback=self.parse_detail, meta={'item': item}, dont_filter=True)
		
		// 如果需要爬多页数据可以编写这一串代码,具体多少页可以根据自己的需求来
        if self.page <= 3:
            self.page += 1
            new_url = self.base_url.format(self.page)
            yield scrapy.Request(url=new_url, callback=self.parse)
	
	// 这里是定义对视频网址信息的获取的函数,思路与parse()函数类似
    def parse_detail(self, response):
        html = etree.HTML(response.text)
        play = html.xpath('//*[@id="viewbox_report"]/div/div/span[1]/text()')
        date = html.xpath('//*[@id="viewbox_report"]/div/div/span[3]/span/span/text()')
        dianzan = html.xpath('//*[@id="arc_toolbar_report"]/div[1]/span[1]/span/text()')
        toubi = html.xpath('//*[@id="arc_toolbar_report"]/div[1]/span[2]/span/text()')
        shoucang = html.xpath('//*[@id="arc_toolbar_report"]/div[1]/span[3]/span/text()')
        item = response.meta['item']
        item['play'] = play[0].strip()
        item['date'] = date[0].strip()
        item['dianzan'] = dianzan[0].strip()
        item['toubi'] = toubi[0].strip()
        item['shoucang'] = shoucang[0].strip()
		
		// 所有数据都写入item实例后就可以向引擎提交了,每个item包括了一个视频的相关数据,之后引擎会把item交给pipeline处理。
        yield item


编写pipelines.py文件

爬虫文件的作用是将爬取到的数据暂时保存在内存中,如果想要将数据保存至本地或者数据库中就需要通过编写pipelines.py文件来实现了。
这里我选择的是保存为excel文件,需要用到openyxl库,代码如下:

import openpyxl


class BiliPipeline:
    def __init__(self):
        print('开始写入')
        self.wb = openpyxl.Workbook()
        self.ws = self.wb.active    # 获取活动表
        self.ws.append(['视频标题', '视频播放量', '视频点赞量', '视频投币量', '视频收藏量', '视频发布日期', '视频时长'])    # 添加表头

    def process_item(self, item, spider):
        print(f'正在保存:{item["title"]}')
        line = [item['title'], item['play'], item['dianzan'], item['toubi'], item['shoucang'], item['date'], item['time']]
        self.ws.append(line)
        return item

    def close_spider(self, spider):
        self.wb.save('video.xlsx')
        self.wb.close()
        print('保存完毕')

编写setting.py文件

所有文件编写完成之后,我们还需要打开setting.py文件进行设置,确保所有功能能够正常进行。
以下是需要修改或取消注释的内容,没有写的默认即可。

// 不遵守robottxt协议,将True改为False
ROBOTSTXT_OBEY = False
// 在请求头中添加自己浏览器的UA信息
DEFAULT_REQUEST_HEADERS = {
   "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
   "Accept-Language": "en",
   'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 QIHU 360SE'
}
// 取消下载器中间件的注释
DOWNLOADER_MIDDLEWARES = {
   "bili.middlewares.BiliDownloaderMiddleware": 543,
}
// 取消item_pipelines的注释
ITEM_PIPELINES = {
   "bili.pipelines.BiliPipeline": 300,
}
// 设置一般日志不显示,只显示等级为警告以上的日志
LOG_LEVEL = "WARNING"

启动爬虫和查看数据

这样一来所有的代码都编写完成了,之后我们可以在爬虫项目的根目录下,通过pycharm新建一个start.py文件。
python爬虫实战 scrapy+selenium爬取动态网页

在该文件中,输入以下代码并执行:

from scrapy import cmdline
cmdline.execute('scrapy crawl bili'.split(' '))

也可以通过cmd窗口进入爬虫项目根目录下输入以下指令:

scrapy crawl bili

都可以启动我们的爬虫,启动完成之后等待爬虫程序自然关闭,就可以在根目录下看到我们爬取到的video.xlsx文件了。

这样一来,本次的爬虫实战就圆满完成了。文章来源地址https://www.toymoban.com/news/detail-469414.html

到了这里,关于python爬虫实战 scrapy+selenium爬取动态网页的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • scrapy爬虫爬取多网页内容

    摘要 :此案例是爬取目标网站( https://tipdm.com/ )的 新闻中心 板块的 公司新闻 中所有新闻的标题、发布时间、访问量和新闻的文本内容。 我使用的是 Anaconda prompt 我们使用如下命令创建scrapy项目: scrapy startproject spider_name 爬虫路径 spider_name 是项目的名字 爬虫路径 就是项目

    2023年04月21日
    浏览(12)
  • 爬虫入门指南(4): 使用Selenium和API爬取动态网页的最佳方法

    随着互联网的发展,许多网站开始采用动态网页来呈现内容。与传统的静态网页不同,动态网页使用JavaScript等脚本技术来实现内容的动态加载和更新。这给网页爬取带来了一定的挑战,因为传统的爬虫工具往往只能获取静态网页的内容。本文将介绍如何使用Selenium和API来实现

    2024年02月11日
    浏览(16)
  • python爬虫进阶篇:Scrapy中使用Selenium+Firefox浏览器爬取沪深A股股票行情

    上篇记录了Scrapy搭配selenium的使用方法,有了基本的了解后我们可以将这项技术落实到实际需求中。目前很多股票网站的行情信息都是动态数据,我们可以用Scrapy+selenium对股票进行实时采集并持久化,再进行数据分析、邮件通知等操作。 详情请看上篇笔记 items middlewares setti

    2024年02月04日
    浏览(15)
  • Python爬虫|使用Selenium轻松爬取网页数据

    1. 什么是selenium? Selenium是一个用于Web应用程序自动化测试工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作浏览器一样。支持的浏览器包括IE,Firefox,Safari,Chrome等。 Selenium可以驱动浏览器自动执行自定义好的逻辑代码,也就是可以通过代码完全模拟成人类使用

    2024年02月04日
    浏览(14)
  • 【爬虫】7.2. JavaScript动态渲染界面爬取-Selenium实战

    爬取的网页为:https://spa2.scrape.center,里面的内容都是通过Ajax渲染出来的,在分析xhr时候发现url里面有token参数,所有我们使用selenium自动化工具来爬取JavaScript渲染的界面。

    2024年02月10日
    浏览(13)
  • Python实战:用Selenium爬取网页数据

    网络爬虫是Python编程中一个非常有用的技巧,它可以让您自动获取网页上的数据。在本文中,我们将介绍如何使用Selenium库来爬取网页数据,特别是那些需要模拟用户交互的动态网页。 Selenium是一个自动化测试工具,它可以模拟用户在浏览器中的操作,比如点击按钮、填写表

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

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

    2024年02月02日
    浏览(9)
  • Python爬虫入门系列之Selenium实现动态页面爬取

    在前一篇博客中,我们学习了如何使用多线程优化爬虫程序。但是,如果要爬取的网页是动态生成的或者包含大量JavaScript代码,单纯的静态页面爬取就不足够了。为了解决这个问题,我们可以使用Selenium库来模拟真实的浏览器行为,从而实现动态页面的爬取。 Selenium是一个用

    2024年02月11日
    浏览(14)
  • Python爬虫实战:selenium爬取电商平台商品数据

    目标 先介绍下我们本篇文章的目标,如图: 本篇文章计划获取商品的一些基本信息,如名称、商店、价格、是否自营、图片路径等等。 准备 首先要确认自己本地已经安装好了 Selenium 包括 Chrome ,并已经配置好了 ChromeDriver 。如果还没安装好,可以参考前面的前置准备。 分析

    2024年04月11日
    浏览(14)
  • Python爬虫实战:selenium爬取电商平台商品数据(1)

    def index_page(page): “”\\\" 抓取索引页 :param page: 页码 “”\\\" print(‘正在爬取第’, str(page), ‘页数据’) try: url = ‘https://search.jd.com/Search?keyword=iPhoneev=exbrand_Apple’ driver.get(url) if page 1: input = driver.find_element_by_xpath(‘//*[@id=“J_bottomPage”]/span[2]/input’) button = driver.find_element_by_xpath(‘

    2024年04月28日
    浏览(12)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包