如果你今天的工作是从竞争对手的网站上抓取定价页面信息。你会怎么做?复制粘贴?手动输入数据?当然不行!他们绝对会花费你超级多的时间,而且你可能会犯一些错误。
需要指出的是,Python已经成为最流行的数据抓取编程语言之一,它到底有什么魅力呢?
网页抓取是从网站提取数据的过程。这可以手动完成,但最好使用一些自动化工具或脚本来高效准确地收集大量数据。从网页复制和粘贴实际上也是进行网页抓取。
Python 被认为是网页抓取的最佳选择之一,原因如下:
Java 也是网页抓取的重要语言。你可以在Java Web Scraping 教程中学习 3 种有用的方法。
您准备好开始使用 Python 进行网页抓取了吗?在弄清楚基本步骤之前,请确保您知道会发生什么以及如何进行。
网络抓取涉及一个系统的过程,包括四个主要任务:
1. 检查目标页面
在提取数据之前,您需要了解网站的布局和数据结构:
2. 检索 HTML 内容
要抓取一个网站,首先需要访问它的 HTML 内容:
3.从 HTML 中提取数据
获得 HTML 后,下一步就是提取所需的信息:
4. 存储提取的数据
提取数据后,将其存储为可访问的格式至关重要:
提示:网站是动态的,因此请定期检查和更新您的抓取过程以保持数据是最新的。
Python 网页抓取可以应用于多种场景,包括:
网络抓取有其自身的一系列挑战:
此外,网站还采用了 IP 封锁、JavaScript 挑战和 CAPTCHA 等反机器人措施。这些措施可以通过轮换代理和无头浏览器等技术来规避。
陷入网络抓取困境?
绕过反机器人检测,简化网络抓取和自动化
免费试用 Nstbrowser!
您对网页抓取和 Browseless 有什么好的想法或疑惑吗?
快来看看其他开发人员在 Discord 和 Telegram 上分享了什么!
虽然网页抓取功能多样,但也有其他选择:
使用 Python 踏上您的网络抓取之旅,释放在线数据的巨大潜力!
首先,我们需要安装我们的shell:
pip install selenium requests json
安装完成后请新建scraping.py文件并在文件中引入我们刚刚安装的库:
import json
from urllib.parse import quote
from urllib.parse import urlencode
import requests
from requests.exceptions import HTTPError
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.common.by import By
为了进行准确的演示,我们将使用 Nstbrowser(一款完全免费的反检测浏览器)作为完成我们任务的工具:
def create_and_connect_to_browser():
host = '127.0.0.1'
api_key = 'xxxxxxx' # your api-key
config = {
'once': True,
'headless': False, # headless
'autoClose': True,
'remoteDebuggingPort': 9226,
'userAgent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'fingerprint': { # required
'name': 'custom browser',
'platform': 'windows', # support: windows, mac, linux
'kernel': 'chromium', # only support: chromium
'kernelMilestone': '120',
'hardwareConcurrency': 4, # support: 2, 4, 8, 10, 12, 14, 16
'deviceMemory': 4, # support: 2, 4, 8
'proxy': '', # input format: schema://user:password@host:port eg: http://user:password@localhost:8080
}
}
query = urlencode({
'x-api-key': api_key, # required
'config': quote(json.dumps(config))
})
url = f'http://{host}:8848/devtool/launch?{query}'
print('devtool url: ' + url)
port = get_debugger_port(url)
debugger_address = f'{host}:{port}'
print("debugger_address: " + debugger_address)
连接到Nstbrowser之后,我们通过Nstbrowser返回给我们的调试器地址连接到Selenium:
def exec_selenium(debugger_address: str):
options = webdriver.ChromeOptions()
options.add_experimental_option("debuggerAddress", debugger_address)
# Replace with the corresponding version of WebDriver path.
chrome_driver_path = r'./chromedriver' # your chrome driver path
service = ChromeService(executable_path=chrome_driver_path)
driver = webdriver.Chrome(service=service, options=options)
至此,我们已经成功通过 Selenium 启动了 Nstbrowser。现在开始抓取吧!
driver.get("https://www.imdb.com/chart/top")
python scraping.py
如您所见,我们成功启动了 Nstbrowser 并访问了目标网站。
我们可以使用Selenium来获取这种dom结构,并分析其内容:
movies = driver.find_elements(By.CSS_SELECTOR, "li.cli-parent")
for row in movies:
title = row.find_element(By.CLASS_NAME, 'ipc-title-link-wrapper') # get title
year = row.find_element(By.CSS_SELECTOR, 'span.cli-title-metadata-item') # get created year
rate = row.find_element(By.CLASS_NAME, 'ipc-rating-star') # get rate
move_item = {
"title": title.text,
"year": year.text,
"rate": rate.text
}
print(move_item)
当然,在终端输出这些信息并不是我们的目的,接下来我们需要将爬取到的数据保存起来。
我们使用 JSON 库将检索到的数据保存到 JSON 文件:
movies = driver.find_elements(By.CSS_SELECTOR, "li.cli-parent")
movies_info = []
for row in movies:
title = row.find_element(By.CLASS_NAME, 'ipc-title-link-wrapper')
year = row.find_element(By.CSS_SELECTOR, 'span.cli-title-metadata-item')
rate = row.find_element(By.CLASS_NAME, 'ipc-rating-star')
move_item = {
"title": title.text,
"year": year.text,
"rate": rate.text
}
movies_info.append(move_item)
# create the json file
json_file = open("movies.json", "w")
# convert movies_info to JSON
json.dump(movies_info, json_file)
# release the file resources
json_file.close()
如何使用 Python 和 Selenium 进行网页抓取?本详细教程涵盖了您正在寻找的所有内容。为了全面了解,我们讨论了 Python 用于网页抓取的概念和优势。然后,以免费的反检测浏览器 - Nstbrowser为例,介绍具体步骤。我相信您现在已经学到了很多有关 Python 网页抓取的知识!是时候操作您的项目并收集数据了。