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

selenium+Xpath

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

然后使用selenium+Xpath爬虫

from selenium import webdriver
from selenium.webdriver.common.by import By
import openpyxl
import timedef 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).textcontent2 = driver.find_element(By.XPATH, xpath2).textcontent3 = driver.find_element(By.XPATH, xpath3).textcontent4 = driver.find_element(By.XPATH, xpath4).textreturn 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 BeautifulSoupurl = "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 scrapyclass MySpider(scrapy.Spider):name = 'myspider'start_urls = ['https://example.com']def parse(self, response):# 使用XPathtitle = 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 scrapyclass 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 launchasync 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 launchasync 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 launchasync 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.mzph.cn/news/730101.shtml

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

相关文章

洗地机热门品牌测评:石头/希亦/顺造/云鲸洗地机哪个好?哪个牌子最值得入手

大家好&#xff0c;博主是一个热爱生活和科技的居家测评博主。在过去的三年多时间里&#xff0c;我专注于清洁家电——洗地机。我深入测评了三十多款洗地机&#xff0c;现在我将用简单易懂的语言来分享洗地机的选购技巧和热门洗地机机型推荐。 洗地机选购技巧&#xff1a; 看…

免费域名证书的优势及申请

免费域名证书的优势 经济实惠&#xff1a;免费域名证书的最大优势在于其零成本。对于那些预算紧张的小型网站和个人开发者来说&#xff0c;这无疑是一个巨大的福音。他们无需支付任何费用&#xff0c;即可获得与付费证书相媲美的安全保护。简单易用&#xff1a;免费域名证书的…

智慧城市如何助力疫情防控:科技赋能城市安全

目录 一、引言 二、智慧城市与疫情防控的紧密结合 三、智慧城市在疫情防控中的具体应用 1、智能监测与预警系统 2、智慧医疗与健康管理 3、智能交通与物流管理 4、智慧社区与基层防控 四、科技赋能城市安全的未来展望 五、结论 一、引言 近年来&#xff0c;全球范围内…

二维码门楼牌管理系统应用场景:商业与零售业发展的助推器

文章目录 前言一、二维码门楼牌管理系统的基本功能二、商业和零售业中的应用场景三、二维码门楼牌管理系统的优势分析四、结论 前言 在数字化时代的浪潮中&#xff0c;二维码门楼牌管理系统凭借其独特的优势&#xff0c;正在逐步成为商业和零售业发展的新宠。它不仅能够为商家…

测试环境搭建整套大数据系统(九:docker学习)

一&#xff1a;为什么学习dockder&#xff1f; 对于组件的搭建和部署&#xff0c;可以简化。 二&#xff1a;什么是docker&#xff1f; docker是一个平台。 三&#xff1a;怎么使用docker&#xff1f; 1. 安装&#xff0c;切换仓库。 安装 curl -fsSL https://test.docke…

家用洗地机哪个型号好用?介绍几个值得考虑的品牌

作为家里的主要清洁工&#xff0c;我一直以来都是负责家里的清洁工作。我经常使用吸尘器和扫地机器人来轮流清洁&#xff0c;虽然效果还不错&#xff0c;但是这种方式太费时间和精力了。特别是在脸上厨房里做完饭和孩子吃完饭后留下的残渣时&#xff0c;我总是需要用传统的拖多…

文献学习-13-机器人顶刊IJRR近期国人新作(2024.3)

一、IJRR简介 The International Journal of Robotics Research&#xff08;IJRR&#xff09;是机器人领域的高水平学术期刊&#xff0c;专注于发布关于机器人技术和相关领域的最新研究成果。IJRR创刊于1982年&#xff0c;是该领域的第一本学术刊物&#xff0c;2022-2023最新影…

掼蛋的牌型与规律(上篇)

掼蛋是一项配合类的棋牌竞技游戏&#xff0c;掼蛋的最大魅力以及最集中的特点在于变化&#xff0c;在于组牌的变数。有的掼蛋新手往往先把牌配死&#xff0c;并且直接决定好出牌计划&#xff0c;然后守株待兔。掼蛋的取胜之道在于静态组合加上动态变化。本文主要介绍一下掼蛋的…

【代码随想录算法训练营Day30】回溯算法总结(题暂时跳过,做完补上)

❇️Day 30 第七章 回溯算法 part06 ✴️今日内容 332.重新安排行程51.N皇后37.解数独总结 今天这三道题都非常难&#xff0c;那么这么难的题&#xff0c;为啥一天做三道&#xff1f;因为 一刷 也不求大家能把这么难的问题解决&#xff0c;所以 大家一刷的时候&#xff0c;就…

基于MPPT的太阳能光伏电池simulink性能仿真,对比扰动观察法,增量电导法,恒定电压法

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 扰动观察法 (Perturb and Observe Method) 4.2 增量电导法 (Incremental Conductance Method) 4.3 恒定电压法 (Constant Voltage Method) 5.完整工程文件 1.课题概述 在simulink中&#xff0c;实…

基于51单片机风速仪风速测量台风预警数码管显示

基于51单片机风速仪风速测量报警数码管显示 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真4. 程序代码5. 设计报告&#x1f517;6. 下载链接资料下载链接&#xff1a; 基于51单片机风速仪风速测量报警数码管显示( proteus仿真程序设计报告讲解视频&#xff09; 仿真图…

C/C++内存管理【C++】

目录 一、 C/C内存分布1. C内存管理方式(1) new和delete操作内置类型(2) new和delete操作自定义类型 二、 operator new与operator delete函数三、 malloc/free和new/delete的区别四、内存泄漏 一、 C/C内存分布 C/C程序的内存布局会因编译器和操作系统而有所不同&#xff0c;但…

Linux:好用的Linux指令

进程的Linux指令 1.查看进程信息 ​​​​ps ajx | head -1 && ps ajx | grep 进程名创建一个进程后输入上述代码&#xff0c;会打印进程信息&#xff0c;当我们在code.exe中写入打印pid&#xff0c;ppid&#xff0c;这里也和进程信息一致。 while :; do ps ajx | he…

【Java Web】HTML瞄一眼就懂!

目录 一、HTML概念 二、什么是标记语言 三、HTML文档创建 四、HTML基本结构 五、专业词汇 六、HTML常用标签 七、页面布局 八、页面显示特殊符号 一、HTML概念 HTML文件本质上是文本文件&#xff0c;而普通的文本文件只能单纯的显示字符而HTML文件则通过使用HTML标签可…

xlrd库的安装和应用

目录 前言 安装 注意 优点 通用知识 函数方法 使用范例 使用心得 前言 xlrd库特别适合需要处理Excel文件中数据的任务. 同时&#xff0c;需要注意的是&#xff0c;xlrd 主要用于读取Excel文件。如果需要写入Excel文件&#xff0c;可以结合其他库如 openpyxl或者xlsxwri…

嵌入式学习36-TCP要点及http协议

TCP发送文件的粘包问题 1. 例&#xff1a; 发端 1.flv-------->收端 1.flv csfga 2.解决 1. sleep&#xff08;1&#xff09; 延时发送 2.自…

C++ 实战项目之 Boost 搜索引擎

项目地址&#xff1a;https://gitee.com/Vertas/boost-searcher-project 1. 项目背景 日常生活中我们使用过很多搜索引擎&#xff0c;比如百度&#xff0c;搜狗&#xff0c;360搜索等。我们今天是要实现一个像百度这样的搜索引擎嘛&#xff1f;那是不可能的&#xff0c;因为像…

2024年新版CMS内容管理使用,不用回退老版本 使用最新小程序云开发cms内容模型

一&#xff0c;问题描述 最近越来越多的同学找石头哥&#xff0c;说cms用不了&#xff0c;其实是小程序官方最近又搞大动作了&#xff0c;偷偷的升级的云开发cms&#xff08;内容管理&#xff09;以下都称cms&#xff0c;不升级不要紧&#xff0c;这一升级&#xff0c;就导致我…

【三维重建】VastGaussian:用于大场景重建的大3D Gaussian(CVPR 2024)

题目&#xff1a;VastGaussian: Vast 3D Gaussians for Large Scene Reconstruction 来源&#xff1a;清华大学&#xff1b;华为诺亚&#xff1b;中国科学院 链接&#xff1a;https://vastgaussian.github.io/ 总结&#xff1a;VastGaussian&#xff1a;基于3D GS的分块优化重…

7-18 彩虹瓶(Python)

彩虹瓶的制作过程&#xff08;并不&#xff09;是这样的&#xff1a;先把一大批空瓶铺放在装填场地上&#xff0c;然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里。 假设彩虹瓶里要按顺序装 N 种颜色的小球&#xff08;不妨将顺序就编号为 1 到 N&#xff09;。现在工…