根据xlsx文件第一列的网址爬虫

news2024/12/23 17:35:59

selenium+Xpath

在与该ipynb文件同文件下新增一个111.xlsx,第一列放一堆需要爬虫的同样式网页

然后使用selenium+Xpath爬虫

from selenium import webdriver
from selenium.webdriver.common.by import By
import openpyxl
import time

def crawl_data(driver, url):
    driver.get(url)
    time.sleep(5)  # 等待页面加载

    # 爬取指定的XPath内容
    xpath1 = '//*[@id="main"]/div/div/div[2]/div[1]/div/div[1]/div'
    xpath2 = '//*[@id="main"]/div/div/div[2]/div[1]/div/div[1]/p/span'
    xpath3 = '//*[@id="descriptionDiv"]/p'
    xpath4 = '//*[@id="introductionDiv"]/p'
    
    content1 = driver.find_element(By.XPATH, xpath1).text
    content2 = driver.find_element(By.XPATH, xpath2).text
    content3 = driver.find_element(By.XPATH, xpath3).text
    content4 = driver.find_element(By.XPATH, xpath4).text

    return content1, content2, content3, content4

# 启动Chrome浏览器
chrome_options = webdriver.ChromeOptions()
driver = webdriver.Chrome(options=chrome_options)

# 打开Excel文件
file_path = "111.xlsx"
wb = openpyxl.load_workbook(file_path)
ws = wb.active

# 获取第一列的网址
urls = [cell.value for cell in ws["A"]]

# 逐个处理每个网址
for i, url in enumerate(urls, start=1):
    print(f"处理第{i}个网址: {url}")
    
    url_str = str(url) if url is not None else ""
    
    # 爬取数据
    data1, data2, data3, data4 = crawl_data(driver, url_str)

    # 写回Excel文件
    ws.cell(row=i, column=2, value=data1)
    ws.cell(row=i, column=3, value=data2)
    ws.cell(row=i, column=4, value=data3)
    ws.cell(row=i, column=5, value=data4)

# 保存Excel文件
wb.save(file_path)

# 关闭浏览器
driver.quit()

使用Xpath方法相比css定位的好处:如果页面的层级结构非常复杂,XPath提供了更复杂的选择和过滤方式,可以更灵活地定位元素

相比id、class定位的好处:XPath可以根据元素的属性值进行定位,这在某些情况下很有用,尤其是在没有独特标识符(如ID)的情况下

同样使用selenium其它定位的方法

按ID、类名

# 以ID定位元素
element_by_id = driver.find_element(By.ID, 'articleContentId')
print("Element by ID:", element_by_id.text)

# 以类名定位元素
element_by_class = driver.find_element(By.CLASS_NAME, 'title-article')
print("Element by Class Name:", element_by_class.text)

按css选择器

# 以CSS选择器定位元素
element_by_css = driver.find_element(By.CSS_SELECTOR, '#articleContentId')
print("Element by CSS Selector:", element_by_css.text)

不用selenium

Requests + BeautifulSoup

使用BeautifulSoup时,通常通过选择器(CSS选择器)而不是XPath来提取元素

import requests
from bs4 import BeautifulSoup

url = "https://example.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

# 使用CSS选择器
title_element = soup.select_one('#articleContentId')
title = title_element.text if title_element else "Title not found"

paragraphs = soup.select('#articleContentId + div.content p')

# 输出结果
print(f"Title: {title}")
for paragraph in paragraphs:
    print(paragraph.text)

Scrapy

在Scrapy中,可以使用XPath或CSS选择器,具体取决于你的喜好或页面的结构。

XPath

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['https://example.com']

    def parse(self, response):
        # 使用XPath
        title = response.xpath('//*[@id="articleContentId"]/text()').get()
        paragraphs = response.xpath('//*[@id="articleContentId"]/following-sibling::div[@class="content"]/p/text()').getall()

        # 输出结果
        print(f"Title: {title}")
        for paragraph in paragraphs:
            print(paragraph)

css

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['https://example.com']

    def parse(self, response):
        # 使用CSS选择器
        title = response.css('#articleContentId::text').get()
        paragraphs = response.css('#articleContentId + div.content p::text').getall()

        # 输出结果
        print(f"Title: {title}")
        for paragraph in paragraphs:
            print(paragraph)

Pyppeteer / Playwright

使用Pyppeteer或Playwright时,你可以通过JavaScript在页面上执行脚本来获取数据,而不是直接使用XPath

XPath

from pyppeteer import launch

async def crawl_data(url):
    browser = await launch()
    page = await browser.newPage()
    await page.goto(url)

    # 使用JavaScript执行脚本获取内容
    title = await page.evaluate('document.evaluate("//*[@id=\"articleContentId\"]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.textContent')
    paragraphs = await page.evaluate('Array.from(document.evaluate("//*[@id=\"articleContentId\"]//p", document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)).map(p => p.textContent)')

    # 输出结果
    print(f"Title: {title}")
    for paragraph in paragraphs:
        print(paragraph)

    await browser.close()

# 使用asyncio来运行异步代码
import asyncio
asyncio.get_event_loop().run_until_complete(crawl_data('https://example.com'))

element选择器

Element选择器实际上是通过HTML元素的标签名来选择元素,而不是通过ID或类名。

HTML元素的标签名就是元素的名称,通常是由尖括号括起来的部分。下述h1、p、a就是HTML元素的标签名

<h1>这是一个标题</h1>
<p>这是一个段落</p>
<a href="https://www.example.com">这是一个链接</a>

所以,如果你想使用element选择器,你可以这样修改代码:

from pyppeteer import launch

async def crawl_data(url):
    browser = await launch()
    page = await browser.newPage()
    await page.goto(url)

    # 使用JavaScript执行脚本获取内容
    title = await page.evaluate('document.querySelector("h1#articleContentId").textContent')
    paragraphs = await page.evaluate('Array.from(document.querySelector("h1#articleContentId + div.content").querySelectorAll("p")).map(p => p.textContent)')

    # 输出结果
    print(f"Title: {title}")
    for paragraph in paragraphs:
        print(paragraph)

    await browser.close()

# 使用asyncio来运行异步代码
import asyncio
asyncio.get_event_loop().run_until_complete(crawl_data('https://example.com'))

在这个例子中,我们使用了document.querySelector("h1#articleContentId")来选择ID为articleContentId的h1元素,以及document.querySelector("h1#articleContentId + div.content").querySelectorAll("p")来选择与该h1元素相邻的div元素内的所有p元素。

css

from pyppeteer import launch

async def crawl_data(url):
    browser = await launch()
    page = await browser.newPage()
    await page.goto(url)

    # 使用JavaScript执行脚本获取内容
    title = await page.evaluate('document.querySelector("#articleContentId").textContent')
    paragraphs = await page.evaluate('Array.from(document.querySelectorAll("#articleContentId p")).map(p => p.textContent)')

    # 输出结果
    print(f"Title: {title}")
    for paragraph in paragraphs:
        print(paragraph)

    await browser.close()

# 使用asyncio来运行异步代码
import asyncio
asyncio.get_event_loop().run_until_complete(crawl_data('https://example.com'))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1500040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何选择VR全景设备,才能拍摄高质量的VR全景?

随着VR全景技术的不断成熟和发展&#xff0c;VR全景已经成为了摄影爱好者乐于尝试的新手段&#xff0c;VR全景也为广大用户提供了一个全新的视角来探索世界&#xff0c;如果想要拍摄出高质量的VR全景&#xff0c;选择合适的VR全景拍摄设备以及掌握正确的拍摄技巧才是关键。 VR全…

SpringMVC的工作流程简介

SpringMVC控制器工作流程 用户通过浏览器向服务器发送请求&#xff0c;请求会被Spring MVC的前端控制器DispatcherServlet所拦截; DispatcherServlet拦截到请求后&#xff0c;会调用HandlerMapping处理器映射器; 处理器映射器根据请求URL找到具体的处理器&#xff0c;生成处理…

备忘 clang diagnostic 类的应用示例 ubuntu 22.04

系统的ncurses环境有些问题 通过源码安装了ncurses6.3后&#xff0c;才可以在 llvmort-18.1.rc4中编译通过示例&#xff1a; 1&#xff0c;折腾环境 ncurses-6.3$ ./configure ncurses-6.3$ make -j ncurses-6.3$ sudo make install sudo apt install libtinfo5 sudo…

企业计算机服务器中了halo勒索病毒如何解密,halo勒索病毒数据恢复流程

随着网络技术的不断发展&#xff0c;企业的生产运营效率得到了极大提升&#xff0c;越来越多的企业开始利用网络开展各项工作业务&#xff0c;企业的网络数据安全问题&#xff0c;成为大家关心的主要话题。近期&#xff0c;云天数据恢复中心接到多家企业的求助&#xff0c;企业…

Mybatis从入门到CRUD到分页到日志到Lombok到动态SQL再到缓存

Mybatis 入门 1.导入maven依赖 <dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>x.x.x</version> </dependency>2.配置核心文件 <?xml version"1.0" encoding"U…

Flask python开发篇: 写一个简单的接口

第一步&#xff1a;新建flask项目 参考使用pycharm新建一个项目 打开pycharm&#xff0c;根据下面图中箭头顺序&#xff0c;新建一个flask的项目&#xff1b; 第二步&#xff1a;运行项目&#xff0c; 安装成功以后&#xff0c;会有个app.py文件&#xff0c;打开以后&#…

【博士每天一篇文献-实验】Is a Modular Architecture Enough?

阅读时间&#xff1a;2023-11-26 1 介绍 年份&#xff1a;2022 作者&#xff1a;Sarthak Mittal&#xff0c;Yoshua Bengio&#xff0c;蒙特利尔大学 期刊&#xff1a; Advances in Neural Information Processing Systems 引用量&#xff1a;22 这篇论文探讨了模块化架构在机…

信号处理-探索相邻数据点之间的变化和关联性的操作方法

当前值减去前一个值&#xff0c;乘上当前值与前一个值差值的绝对值 当前值减去后一个值&#xff0c;乘上当前值与后一个值差值的绝对值。 意义何在&#xff1f; 当前值减去前一个值&#xff1a;表示当前数据点与前一个数据点之间的变化量。当前值与前一个值差值的绝对值&…

Vue.js环境变量:灵活调整,助您轻松应对各种开发需求

hello宝子们...我们是艾斯视觉擅长ui设计和前端开发10年经验&#xff01;希望我的分享能帮助到您&#xff01;如需帮助可以评论关注私信我们一起探讨&#xff01;致敬感谢感恩&#xff01; Vue.js环境变量&#xff1a;灵活调整&#xff0c;助您轻松应对各种开发需求 一、引言 …

基于vue的联通积分商城数据可视化APP设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 前端技术介绍 3 1.1 前端开发语言 3 1.1.1 HTML5 3 1.1.2 CSS3 3 1.1.3 JavaScript 3 1.2 MVVM开发模式 4 1.3 Vue框架 4 1.4 Axios技术 5 1.5 ECharts 5 1.6 数据库技术 5 1.7 本章小结 6 2 前端开发的分析 7 2.1 功能性需求分析 7 2.2 …

二百二十六、Linux——shell脚本查看今天日期、昨天日期、30天前日期、1月前日期

一、目的 由于磁盘资源有限&#xff0c;因为对原始数据的保存有事件限制&#xff0c;因为对于超过一定期限的数据文件则需要删除&#xff0c;要实现定期删除则第一步就是查看日期时间 二、在Linux中创建shell脚本 #! /bin/bash source /etc/profile nowdatedate --date0 da…

龙芯第四代3A6000主板与龙芯3A500龙架构兼容,具备丰富的接口和扩展性

龙芯 3A6000 处理器完全自主设计、性能优异&#xff0c;代表了我国自主桌面 CPU 设计领域的最新里程碑成果。龙芯 3A6000 处理器的推出&#xff0c;说明国产 CPU 在自主可控程度和产品性能上已双双达到新高度&#xff0c;也证明了国内有能力在自研 CPU 架构上做出一流的产品。 …

高德企业用车升级服务套件,全面提升打车体验

在企业员工因公用车场景中&#xff0c;下班回家、公务出行等固定路线的用车需求占比近四成。为简化叫车流程&#xff0c;提升出行体验&#xff0c;高德企业用车日前上线“一键回家”功能&#xff0c;帮助企业员工快速设定常用目的地&#xff0c;有效减少反复输入行程信息带来的…

重塑语言智能未来:掌握Transformer,驱动AI与NLP创新实战

Transformer模型 Transformer是自然语言理解(Natural Language Understanding&#xff0c;NLU)的游戏规则改变者&#xff0c;NLU 是自然语言处理(Natural Language Processing&#xff0c;NLP)的一个子集。NLU已成为全球数字经济中AI 的支柱之一。 Transformer 模型标志着AI 新…

操作系统:进程状态

目录 1.进程状态 1.1.运行状态 1.2.阻塞状态 1.3.挂起状态 1.4.终止状态 2.Linux下的进程状态 2.1.常规的进程状态 2.2.僵尸进程和孤儿进程 2.2.1僵尸进程 2.2.2.孤儿进程 1.进程状态 进程状态是指一个进程在其生命周期中所处的不同状态 1.1.运行状态 当操作系统选择一…

【MySQL知识体系】第1章 初识 MySQL

文章目录 第1章 初识 MySQL1.1 MySQL 介绍1.1.1 什么是 MySQL&#xff1f;1.1.2 MySQL 的特点&#xff1f;1.1.3 MySQL 默认端口&#xff1f; 1.2 安装 MySQL1.2.1在MacOS上安装MySQL1.2.2 在Windows上安装MySQL 1.3 如何选择 MySQL 客户端1.3.1 在MacOS上安装Workbench1.3.2 在…

“2024杭州智慧城市及安防展会”将于4月在杭州博览中心盛大召开

2024杭州国际智慧城市及安防展览会&#xff0c;将于4月24日在杭州国际博览中心盛大开幕。这场备受瞩目的盛会&#xff0c;不仅汇集了全球智慧城市与安防领域的顶尖企业&#xff0c;更是展示最新技术、交流创新理念的重要平台。近日&#xff0c;从组委会传来消息&#xff0c;展会…

vscode 使用ssh进行远程开发 (remote-ssh),首次连接及后续使用,详细介绍

在vscode添加remote ssh插件 首次连接 选择左侧栏的扩展&#xff0c;并搜索remote ssh 它大概长这样&#xff0c;点击安装 安装成功后&#xff0c;在左侧栏会出现远程连接的图标&#xff0c;点击后选择ssh旁加号便可以进行连接。 安装成功后vscode左下角会有一个图标 点击图…

typescript 学习

一.typescript是Javascript的超集,在javascript中添加特性的语言扩展,支持ES6标准。 二.typescript中新增了:类型批注和编译时类型检查,类型推断,类型擦除,接口,枚举,Mixin,泛型编程,名字空间,元组,await等 三.vscode 中怎样使用typescript 1. 安装VSCode (官网下…

考研数学|到底要不要做张宇《1000题》

根据你自身能力来选择真正适合你的题集&#xff0c;最后的做题效果会加倍。&#x1f60e; 我先分析一下张宇1000题集的特点&#xff0c;张宇1000更适合基础不错&#xff0c;想冲刺高分的同学。 1000分为强化和提高&#xff0c;是没有基础部分的&#xff0c;着重考察数学概念和技…