用selenium去爬取大麦网页面的演唱会信息

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

实验目的:

利用selenium.webdriver爬取大麦网页面演唱会信息,信息包括:演唱会标题、时间、价钱、地点、图片、网址。

实验环境:

操作环境:

1. Window10;  2. python3.9;   3. PycharmIDE

第三方库版本:

1. selenium 4.1.1

2. requests 2.28.1

本实验主要利用Goggle chrome浏览器进行,其中浏览器版本为118开头,可在设置关于Chrome查看。

浏览器源代码查看大麦数据,爬虫,selenium,python,爬虫

驱动下载网站:
Chrome for Testing availability (googlechromelabs.github.io)

注意下载win32 stable版本,我选择如下驱动器:

浏览器源代码查看大麦数据,爬虫,selenium,python,爬虫

实验步骤:

1. 导入相关库:

from selenium import webdriver  # 用于网页自动化操作
import requests  # 用于发送HTTP请求
from selenium.webdriver.common.by import By  # 用于定位元素
import os  # 用于操作系统相关的功能
import time  # 用于控制代码的运行和等待时间

2. 初始化Chrome WebDriver:

为了解决“Chrome正受到自动测试软件的控制”和“请停用以开发者模式运行的扩展程序”情况,在创建WebDriver初始化前添加命令:

# 创建ChromeOptions对象
option = webdriver.ChromeOptions()
 # 添加实验选项,排除自动化标识
option.add_experimental_option("excludeSwitches", ['enable-automation'])

同时为了结果网页出现闪退显示,同样再添加命令:

 # 添加实验选项,使浏览器在后台运行
option.add_experimental_option("detach", True)

接下来就是初始化webdriver对象:

注意使用你安装的驱动位置。

# 初始化Chrome WebDriver
driver = webdriver.Chrome(r"E:\chromedriver-win32\chromedriver-win32\chromedriver.exe", options=option)
3. 使用WebDriver打开制定URL:
# 使用WebDriver打开指定的URL  
driver.get("https://search.damai.cn/search.htm?spm=a2oeg.home.category.ditem_0.4e2523e1PJPX0w&ctl=%E6%BC%94%E5%94%B1%E4%BC%9A&order=1&cty=%E5%8C%97%E4%BA%AC")

爬取网页情况:

浏览器源代码查看大麦数据,爬虫,selenium,python,爬虫

4. 初始化变量:

同时我们初始化相关变量items,用于存放每场演唱会的信息,同时使用变量"i"用以表示的爬取图片序号,同时规定爬取该网页前10的演唱会信息,及使用for循环执行。

除此之外,该网页中存在一些差异信息,比方如下:

浏览器源代码查看大麦数据,爬虫,selenium,python,爬虫

其中对于第一个演唱会,其信息不包含“艺人”信息,而第二个演唱会中存在“艺人”信息,这对于执行循环爬取演唱会信息来说,则需要进行元素定位判断,毕竟“艺人”信息不是我们要爬取的。

下面采用XPATH方法进行元素定位。

5. 元素定位与判断:

我们首先利用XPATH查看“艺人”信息存在于不存在之间的差异。

在Chromel浏览器中选中存在“艺人”信息的演唱会,右击在弹出的方框中选择检查:

浏览器源代码查看大麦数据,爬虫,selenium,python,爬虫

在右侧显示蓝色位置同样右键,选择Copy,选择Copy ful xpath:

浏览器源代码查看大麦数据,爬虫,selenium,python,爬虫

full xpath 路径:

/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[2]/div/div[2]

而对于没有存在“艺人”信息的演唱会,同样的full xpath路径显示的我们需要爬取的演唱会地址信息。下面就对于此差异影响下存在“艺人”信息和不存在“艺人”信息的演唱会xpath路径的差异。

其中对于没有“艺人”信息的演唱会,其xpath路径信息差异仅仅存在倒数第三或第一个div的位置索引上。对于如何查看差异,可以对不存在“艺人”信息的演唱会采用如上xpath查看方法查看其演唱会标题、时间、价钱、地点、图片、网址的xpath在div的具体差异。

最终发现存在差异的仅仅是时间、价钱、地点信息由于“艺人”信息存在而导致div不同。

下面举时间为例,给出xpath信息:

# 不存在艺人信息的演唱会时间xpath
/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[1]/div/div[3]

# 存在艺人信息的演唱会时间xpath
/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[2]/div/div[4]

以上可以看出倒数第三个div信息索引存在差异,其原因是不同演唱会引起的,此为我们要循环遍历的位置索引。

同时存在倒数第一个div差异,其原因就是因为存在“艺人”信息,通过观察xpath路径不难发现由于“艺人”信息的div存在于时间、价格、地点之前,而导致其位置索引向后移动一位。因此我们需要根据是否存在“艺人”信息来改变时间、价格、地点的位置索引。

这里使用flag列表变量作为以上元素的索引存在处,如果判断不存在“艺人”信息则使用索引位置为[3,2,5]位置,否则使用[4,3,6],由于我爬取的信息是先时间、地点、价格的顺序进行的,因此对于索引在列表的位置可能与你想的不太一样,具体希望你能针对以上差异信息进行逐一查看xpath信息的差异。

同时为了让每个演唱会的信息一一对应这里常用了字典生成式,方便将每个演唱会信息加到到总的爬取信息items列表存放位置中。

判断信息如下:

items = []  # 存放演唱会对象数据
for j in range(1, 11):
    flag = None
    # 判断元素的文本是否以'艺'开头
    if driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(i + 1) + "]/div/div[2]").text[0] != '艺':
        flag = [3, 2, 5]
    else:
        flag = [4, 3, 6]

注意我的selenium版本,因为此版本中不存在find_element_by_xpath方法了,所以采用find_element方法代替,利用By库的XPATH确定爬取的方法,最后将爬取内容使用text()属性转为文本信息进行判断。

其余信息的定位:

item = {
        'title': driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(
            i + 1) + "]/div/div[1]/a").text,
        'time': driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(
            i + 1) + "]/div/div[" + str(flag[0]) + "]").text,
        'place': driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(
            i + 1) + "]/div/div[" + str(flag[1]) + "]").text,
        'amount': driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(
            i + 1) + "]/div/div[" + str(flag[2]) + "]/span").text,
        'href': driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(
            i + 1) + "]/a").get_attribute('href')}
img = driver.find_element(by=By.XPATH,value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(i + 1) + "]/a/img")

注意对于href,即演唱会网址,其存在于演唱会信息的第一个a标签里,及如图:

浏览器源代码查看大麦数据,爬虫,selenium,python,爬虫

对于Img,演唱会的图片,我们采用其他方法进行存入,而不放入演唱会信息item中。注意href对象的获取,最后不是采用text()属性而是get_attribute()属性,其原因是href信息存在如爬取的元素之中,详细看上图。

6. 信息写入和图片存入:

1)图片存入

由于在执行爬取时经常发现图片没加载完成就爬取,因此参看了其他人的代码,使用time.sleep()函数,其能够等待页面加载完毕后,再爬取,如果你发现你的图片没加载就爬取,可改变其参数值,这里设5s。并使用get_attribute('src')爬取图片url,并利用requests.get()方法获取图片资源。最后利用with open()语句将图片载入,具体代码如下:

time.sleep(5)  # 程序暂停5秒,等待页面加载完毕
i += 1      # 图片序号计数器
t = img.get_attribute('src')  # 获取图片的src属性,即图片的URL 
path = r"D:\demo\图{}.jpg".format(i)  # 存入图片位置
r = requests.get(t)  # 发送GET请求获取图片资源
r.raise_for_status()  # 发送GET请求获取图片资源

# 图片存入
with open(path, 'wb') as f:  # 写入并保存
     f.write(r.content)
     f.close()
     print('保存成功')

结果如下:

浏览器源代码查看大麦数据,爬虫,selenium,python,爬虫

2)演唱会信息存入

这里使用os库的getcwd()方法获取当前工作目录路径,将存放信息的文件命名为damai.txt,同样使用with open()语句将信息写入该文件中,具体代码如下:

base_dir = os.getcwd()  # 获取当前工作目录的路径
filename = base_dir + r'\damai.txt'  # 获取当前工作目录的路径

with open(filename, 'a+') as f:  # 追加
     f.write(str(i) + ':\ntitle:' + item['title'] + '\n')
     f.write('time:' + item['time'] + '\n')
     f.write('place:' + item['place'] + '\n')
     f.write('amount:' + item['amount'] + '\n')
     f.write('href:' + item['href'] + '\n\n')

结果如下:

浏览器源代码查看大麦数据,爬虫,selenium,python,爬虫

7. 全部代码:

注意最后使用.quit()方法关闭webdriver,关闭浏览器进程。其位于循环外。文章来源地址https://www.toymoban.com/news/detail-788237.html

# 导入相关库
from selenium import webdriver  # 用于网页自动化操作
import requests  # 用于发送HTTP请求
from selenium.webdriver.common.by import By  # 用于定位元素
import os  # 用于操作系统相关的功能
import time  # 用于控制代码的运行和等待时间


# 设置Selenium的选项和初始化WebDriver
option = webdriver.ChromeOptions()  # 创建ChromeOptions对象
option.add_experimental_option("excludeSwitches", ['enable-automation'])  # 添加实验选项,排除自动化标识
option.add_experimental_option("detach", True)  # 添加实验选项,使浏览器在后台运行
# 初始化Chrome WebDriver
driver = webdriver.Chrome(r"E:\chromedriver-win32\chromedriver-win32\chromedriver.exe",
                          options=option)
# 设置初始值和打开网页
i = 0  # 初始化变量i,用于后续图片循环计数
# 使用WebDriver打开指定的URL
driver.get("https://search.damai.cn/search.htm?spm=a2oeg.home.category.ditem_0.4e2523e1PJPX0w&ctl=%E6%BC%94%E5%94%B1"
           "%E4%BC%9A&order=1&cty=%E5%8C%97%E4%BA%AC")

items = []  # 存放演唱会对象数据
for j in range(1, 11):
    flag = None
    # 判断元素的文本是否以'艺'开头
    if driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(
            i + 1) + "]/div/div[2]").text[0] != '艺':
        flag = [3, 2, 5]
    else:
        flag = [4, 3, 6]

    # 通过XPath定位元素,获取文本信息并存储到字典中
    item = {
        'title': driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(
            i + 1) + "]/div/div[1]/a").text,
        'time': driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(
            i + 1) + "]/div/div[" + str(flag[0]) + "]").text,
        'place': driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(
            i + 1) + "]/div/div[" + str(flag[1]) + "]").text,
        'amount': driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(
            i + 1) + "]/div/div[" + str(flag[2]) + "]/span").text,
        'href': driver.find_element(by=By.XPATH, value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(
            i + 1) + "]/a").get_attribute('href')}
    img = driver.find_element(by=By.XPATH,
                              value="/html/body/div[2]/div[2]/div[1]/div[3]/div[1]/div/div[" + str(i + 1) + "]/a/img")

    time.sleep(5)  # 程序暂停5秒,等待页面加载完毕
    i += 1      # 图片序号计数器
    t = img.get_attribute('src')  # 获取图片的src属性,即图片的URL
    path = r"D:\demo\图{}.jpg".format(i)  # 存入图片位置
    r = requests.get(t)  # 发送GET请求获取图片资源
    r.raise_for_status()  # 发送GET请求获取图片资源

    # 图片存入
    with open(path, 'wb') as f:
        f.write(r.content)
        f.close()
        print('保存成功')

    items.append(item)  # 将抓取的演唱会数据项添加到总信息列表中

    base_dir = os.getcwd()  # 获取当前工作目录的路径
    filename = base_dir + r'\damai.txt'  # 获取当前工作目录的路径

    with open(filename, 'a+') as f:
        f.write(str(i) + ':\ntitle:' + item['title'] + '\n')
        f.write('time:' + item['time'] + '\n')
        f.write('place:' + item['place'] + '\n')
        f.write('amount:' + item['amount'] + '\n')
        f.write('href:' + item['href'] + '\n\n')

driver.quit()  # 关闭WebDriver,结束浏览器进程

print(items)

到了这里,关于用selenium去爬取大麦网页面的演唱会信息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Python脚本】Python自动大麦网抢票,准点原价秒杀演唱会门票,拒绝黄牛交易!从我做起!!!1

    你是否错过了周杰伦的票,最近又没抢到五月天的票,不要太难过,今晚有张学友的票,后天还有张杰的票,加油哦! Python配套案例源码、资料点击领取福利 为了帮助你在激烈的抢票竞争中获得更大的成功机会,本文将介绍抢票软件的实现原理以及我所了解的一些抢票方式

    2024年02月11日
    浏览(45)
  • 如何使用 Python Selenium 自动购买 Interpark 演唱会门票?

    Interpark是韩国的一家知名网上购物网站,成立于1996年。它是韩国最早开展网上零售业务的公司之一,提供各种产品,包括各种书籍、电子产品、珠宝、户外用品、食品和服装等等。Interpark还提供机票、旅游和酒店等服务。它已经成为韩国最大的综合型网上购物商城之一。 1

    2024年02月10日
    浏览(39)
  • 用Java写一个抢演唱会门票的脚本

    这个代码示例定义了一个 grabTicket 函数,模拟了抢票过程。每个线程都会调用这个函数来进行抢票行为。 在 grabTicket 函数中,首先输出一条消息,表示正在尝试获取门票,并延迟2秒钟模拟网络请求时间。然后,随机决定是否成功获取门票。如果没有成功,则输出相应的消息

    2024年02月12日
    浏览(37)
  • 如何使用 Python 自动购买 Interpark 演唱会门票 ?

    前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 Interpark是韩国的一家知名网上购物网站,成立于1996年。 它是韩国最早开展网上零售业务的公司之一,提供各种产品,包括各种书籍、电子产品、珠宝、户外用品、食品和服装等等。 Interpark还提供机票、旅游和酒店等服务。

    2024年02月13日
    浏览(44)
  • 用Python写一个抢演唱会门票的脚本

    这个代码示例定义了一个 grab_ticket 函数,模拟了抢票过程。每个线程都会调用这个函数来进行抢票行为。 在 grab_ticket 函数中,首先输出一条消息,表示正在尝试获取门票,并延迟2秒钟模拟网络请求时间。然后,随机决定是否成功获取门票。如果没有成功,则输出相应的消息

    2024年02月15日
    浏览(55)
  • 用C++写一个抢演唱会门票的脚本

    这个代码示例首先定义了演唱会门票总数,并初始化剩余门票数量为总数。 然后,它使用一个for循环模拟了多个用户同时进行抢票行为的过程。每个用户都会尝试获取门票,通过随机决定是否成功来模拟网络请求的结果。 如果用户尝试获取门票失败,则将输出相应的消息;

    2024年02月16日
    浏览(75)
  • 程序员大战黄牛党,破解演唱会门票秒光之困

    反黄牛,为何是场持久战? 撰 文 | 林秋艺 编辑 | 龚   正 这个五月,似乎都被五月天霸屏了。从5月9日的30万张五月天演唱会门票被5秒扫光;到粉丝群起反抗,喊出“宁可鸟巢门口站,也不能让黄牛赚”,再到这几天“五月天演唱会黄牛票价格下跌近万元”冲上热搜榜……

    2024年02月06日
    浏览(44)
  • 【开题报告】基于SpringBoot的演唱会门票在线预定系统的设计与实现

    基于Spring Boot的演唱会门票在线预定系统的设计与实现旨在满足现代社会对于便捷、高效购票服务的需求。随着音乐行业的发展和演唱会市场的繁荣,越来越多的人愿意参加演唱会,享受音乐盛宴。然而,传统的线下购票方式存在排队等待和票源紧张等问题,无法满足人们日

    2024年02月08日
    浏览(55)
  • 窄带高清技术之百万级并发下的演唱会直播细节修复

    史无前例,高清又不卡。 5月,百视TV联合上海人民广播电台、时代峰峻共同出品的《东方风云榜》,绚烂呈现一场三十周年音乐分享会·时代少年团《理想之途》。有人说,这是一场似梦非梦的记忆。 演唱会由“乐园”、“少年”、“乌托邦”三大篇章组成,精心之作引来社

    2024年02月07日
    浏览(38)
  • 演唱会门票抢不到?不要慌,教你用python实现自动化抢票

    之前一直在更新从零开始学python系列的系列文,最近有点忙停更了两天,今天来插一篇其他的文章。 之前有小伙伴留言说女朋友快生日了,喜欢某某某但是手动买票根本就是买不到,又不想当大冤种从黄牛手里加钱,于是乎在疯狂星期四的晚上遭到’‘贿赂’\\\'的我连夜搞定

    2024年02月15日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包