根据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.hqwc.cn/news/522137.html

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

相关文章

骨传导蓝牙立体声耳机哪个好?骨传导耳机选购前不可忽视的几个要点

骨传导蓝牙立体声耳机是一种创新的蓝牙耳机设备&#xff0c;它通过将声音转换为特定频率的振动&#xff0c;直接通过颅骨传递到内耳&#xff0c;绕过了外耳道。这种耳机设计为一般为挂耳式&#xff0c;它无需插入耳道&#xff0c;所以不会对耳膜造成损伤&#xff0c;同时也避免…

通过sqoop把hive数据到mysql,脚本提示成功,mysql对应的表中没有数

1、脚本执行日志显示脚本执行成功&#xff0c;读写数量不为0 2、手动往Mysql对应表中写入数据十几秒后被自动删除了 问题原因&#xff1a; 建表时引擎用错了&#xff0c;如下图所示 正常情况下应该用InnoDB

借助工具优化开发流程,提升开发体验

背景 最近在做一个demo&#xff0c;只有一个html页面&#xff0c;需要开启一个https web server&#xff0c;以此来实现在浏览器中访问。 改造前 改造前&#xff0c;每次修改文件保存后都要刷新一下浏览器。 如果只是短时间&#xff0c;每次修改后手动刷新浏览器也还行。主要…

smplx pkl格式可视化

smplx pkl格式可视化 import glob import os import pickleimport torch import numpy as npfrom smplpytorch.pytorch.smpl_layer import SMPL_Layer from display_utils import display_model, display_model_continuousfrom matplotlib import pyplot as plt from matplotl…

构建cef基本框架及构建过程中的参数说明

文章目录 准备源码版本编译版本结构编译过程写了好多CEF的内容了,发现一个最初的CEF helloworld的过程都没有写,也就是如何搭建这个CEF框架。今天把这个过程记录一下。 准备源码版本 在度娘上搜cef源码,一般得到的是https://bitbucket.org/chromiumembedded/cef/这个网址,…

RocketMQ快速入门_2. rocketmq 的应用场景、与其他mq的差异

0. 引言 之前我们讲解过rabbitMQ&#xff0c;本期我们将进入吞吐量更加强大的rocketMQ的学习。 1. 基础概念 如果你是刚接触MQ的同学&#xff0c;还不清楚消息队列的基础概念的&#xff0c;可以参考我之前这篇文章&#xff1a; https://wu55555.blog.csdn.net/article/deta…

产品经理必看,教你写一份简单的产品说明书

作为一名产品经理&#xff0c;你可能会为如何写一份能够有效传达产品特性和使用步骤的说明书而困扰。确实&#xff0c;写作产品说明书的过程中&#xff0c;需要详细并准确展示产品的所有功能&#xff0c;同时保持文本清晰、简洁和易于理解。以下是一些步骤和技巧&#xff0c;可…

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

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

力扣大厂热门面试算法题 9-11

9. 回文数&#xff0c;10. 正则表达式匹配&#xff0c;11. 盛最多水的容器&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.08 可通过leetcode所有测试用例。 目录 9. 回文数 解题思路 完整代码 Java Python 10. 正则表达式…

寡姐出击!《黑寡妇2》AI电影宣传片重磅来袭

寡姐出击&#xff01;《黑寡妇2》AI电影宣传片重磅来袭 The Black Widow returns, but darkness follows her. Black Widow 2 - Secrets buried deep will rise. A web of lies and deceit threatens her very existence. In the shadows, a new enemy lurks, waiting to strik…

一些开发外贸获客系统的代码分享

在数字化快速发展的今天&#xff0c;外贸行业也面临着前所未有的变革&#xff0c;传统的获客方式&#xff0c;如展会、广告等&#xff0c;虽然仍然有其价值&#xff0c;但随着互联网技术的发展&#xff0c;通过线上渠道获取海外客户已成为越来越多外贸企业的选择。 其中&#…

贡献法总结

贡献法的核心在于&#xff0c;分析每个元素对答案的贡献。 1.孤独的照片 4261. 孤独的照片 - AcWing题库 最暴力的做法是枚举出所有情况&#xff0c;时间复杂度是O()&#xff0c;显然会超。 我们用贡献法的方式来思考。 对于某一头牛&#xff0c;假设它为G牛&#xff0c;它…