使用 Python Selenium 进行网页抓取的初学者指南
最初发表在我的网站上
在本系列的第一部分中,我们介绍了网页数据抓取的概念,并使用两个 Python 库——requests 和 BeautifulSoup——完成了这项任务。结果会被存储在 JSON 文件中。在本教程中,我们将使用 Selenium Python 库,以一种略有不同的方式进行网页数据抓取。之后,我们将使用 Pandas 库将结果存储在一个 CSV 文件中。
本示例使用的代码在github上。
为什么要使用硒?
Selenium 是一个旨在自动化 Web 应用程序测试的框架。
您可以编写 Python 脚本来自动控制浏览器交互,例如链接点击和表单提交。此外,当我们想要从网页的 JavaScript 生成内容中抓取数据时,Selenium 也非常有用。这意味着数据需要经过多次 Ajax 请求才能显示出来。尽管如此,BeautifulSoup 和Scrapy都能够完美地从网页中提取数据。库的选择最终取决于特定网页中数据的呈现方式。
在网页抓取过程中,你可能会遇到的另一个问题是你的 IP 地址可能被列入黑名单。我与 scraper API 合作,这是一家专注于制定策略的初创公司,可以帮助你避免在网页抓取过程中 IP 地址被屏蔽的担忧。他们利用 IP 轮换技术,帮助你避免被检测到。他们拥有超过 2000 万个 IP 地址和无限带宽。
除此之外,它们还为您提供验证码处理功能,并启用无头浏览器,这样您看起来就像是真实用户,而不会被检测为网络爬虫。有关其更多用法,请参阅我关于使用 scrapy 进行网络爬虫的文章。不过,您也可以将其与 BeautifulSoup 和 Selenium 一起使用。

网络抓取:使用 scrapy 和 Scraper API 管理代理和验证码
Lewis kori ・ 19 年 10 月 7 日 ・ 阅读时长 8 分钟
使用此scraperapi 链接和代码
lewis10,您将获得首次购买 10% 的折扣!
要获取更多资源来了解 Selenium 库和最佳实践,请单击此处和此处。
设置
我们将使用两个 Python 库:selenium 和 pandas。要安装它们,只需运行
pip install selenium pandas
除此之外,您还需要一个浏览器驱动程序来模拟浏览器会话。
由于我使用的是 Chrome,因此我们将使用它来进行演示。
驱动程序下载
入门
在这个例子中,我们将从专门用于练习网页爬取的引言
中提取数据。 然后,我们将提取所有引言及其作者,并将其存储在一个 CSV 文件中。
from selenium.webdriver import Chrome
import pandas as pd
webdriver = "path_to_installed_driver_location"
driver = Chrome(webdriver)
上面的代码导入了 Chrome 驱动程序和 Pandas 库。
然后,我们创建一个 Chrome 实例,方法是:driver = Chrome(webdriver)
注意,webdriver 变量将指向我们之前为所选浏览器下载的驱动程序可执行文件。如果你更喜欢 Firefox,可以像这样导入:
from selenium.webdriver import Firefox
主脚本
pages = 10
for page in range(1,pages):
url = "http://quotes.toscrape.com/js/page/" + str(page) + "/"
driver.get(url)
items = len(driver.find_elements_by_class_name("quote"))
total = []
for item in range(items):
quotes = driver.find_elements_by_class_name("quote")
for quote in quotes:
quote_text = quote.find_element_by_class_name('text').text
author = quote.find_element_by_class_name('author').text
new = ((quote_text,author))
total.append(new)
df = pd.DataFrame(total,columns=['quote','author'])
df.to_csv('quoted.csv')
driver.close()
仔细检查网站 URL,我们会注意到分页 URL 是
Http://quotes.toscrape.com/js/page/{{current_page_number}}/
其中最后一部分是当前页码。有了这些信息,我们就可以创建一个 page 变量来存储需要抓取数据的网页数量。在本例中,我们将以迭代的方式从 10 个网页中提取数据。
该driver.get(url)
命令向我们所需的网页发出 HTTP get 请求。
从这里开始,重要的是要知道要从网页中提取的确切项目数量。
在之前的演示中,我们将网页抓取定义为
这是利用网页底层代码的模式从网页中提取信息的过程。
我们可以使用网页抓取技术从互联网上收集非结构化数据,对其进行处理,并以结构化格式存储。
检查每个引言元素时,我们发现每个引言都包含在一个带有引言类名的 div 中。通过运行该指令
driver.get_elements_by_class("quote")
我们得到了页面中所有表现出这种模式的元素的列表。
然后用 len() 函数包装该命令以获取该页面内的引用的确切数量,并将其存储在 item 变量中以构成我们的迭代器。
最后一步
quotes = driver.find_elements_by_class_name("quote")
for quote in quotes:
quote_text = quote.find_element_by_class_name('text').text[1:]
author = quote.find_element_by_class_name('author').text
new = ((quote_text,author))
total.append(new)
为了开始从网页中提取信息,我们将利用前面提到的网页底层代码模式。
首先,我们需要上面描述的所有引文的列表。不过,在这一步,我们不会将其封装在 len() 函数中,因为我们需要的是单独的元素。
之后,内部的 for 循环会遍历每句引言并提取一条特定的记录。
从上图中我们注意到,引言被包含在一个包含类文本的范围内,而作者则包含在一个包含作者类名的小标签内。
最后,我们将 quote_text 和 author 姓名变量存储在一个元组中,然后我们继续通过名称 total 将其附加到 python 列表中。
df = pd.DataFrame(total,columns=['quote','author'])
df.to_csv('quoted.csv')
driver.close()
使用 pandas 库,我们将创建一个数据框来存储所有记录(总列表),并将列名指定为 quote 和 author。
最后,将数据框导出为一个 CSV 文件,在本例中我们将其命名为 quoted.csv。
不要忘记使用 driver.close() 关闭 chrome 驱动程序。
附加资源。
1. 查找元素
你会注意到,我在本教程中使用了 find_elements_by_class 方法。这并不是查找元素的唯一方法。Klaus 的这篇教程详细解释了如何使用其他选择器。
2. 视频
如果您更喜欢使用视频学习,那么 Lucid 编程的这个系列对我来说非常有用。
3.使用硒的最佳实践
希望如此,您也可以使用 selenium 制作一个简单的网络抓取工具😎。
如果您喜欢这篇文章,请订阅我的时事通讯,这样当我发布新文章或在Twitter上找到我聊天时您就会收到通知。
谢谢。
鏂囩珷鏉ユ簮锛�https://dev.to/lewiskori/beginner-s-guide-to-web-scraping-with-python-s-selenium-3fl9