CodeGym /课程 /Python SELF ZH /使用“下一页”链接收集数据

使用“下一页”链接收集数据

Python SELF ZH
第 34 级 , 课程 1
可用

1. 分页介绍

谁说你需要的数据会在一个页面上呢?很多时候你得从一堆页面中挖取数据,甚至这些数据分布在整个网站上。所以你遇到的第一个挑战之一就是数据分页。而从中收集它们的有趣工作,被称为分页(pagination)。

是的,分页不仅是在你期待 Google 结果转到下一页时的那一刻,还是当一个爬虫程序疑惑地问自己:“怎么自动化这个过程,不用手动操作?”的时候。

分页是一种网站组织数据的方式,目的是避免页面内容过长。为此,网站将数据分割成多页,并添加像“下一页”或“下一步”这样的链接,用来从一个页面跳转到另一个页面。这是个重要的概念,因为你作为一个爬虫,不会想告诉你的老板,你没抓到某些数据,因为它藏在“第五页”上。

2. 从多个页面抓取数据的问题

你可能遇到的第一个问题是,缺乏直观且可预测的 URL。有些网站在你浏览页面时,URL 不会有明显的变化,这让自动化变得相当复杂。例如,与其是 page=1, page=2, 你可能会遇到 x=abc, x=def,但没有明显规律。

第二个问题是反爬机制。有些网站会积极监控来自某个 IP 地址的请求次数。如果他们发现你请求太多,可能会暂时(或者永久)封锁你。

但别担心,我们现在会学会如何像专业的爬虫那样绕过这些困难。

3. 绕过分页

技术和策略

  1. 分析 URL 结构:通常,页面会在 URL 中使用参数表示页面号,例如 ?page=2。如果你发现了这个,恭喜你,你找到了解决分页的黄金模版!
  2. 查找“下一页”链接:有时 URL 不够直观。在这些情况下,你需要在页面上查找“下一页”或“下一步”的链接并跟随它们。
  3. 使用 AJAX 请求:有些网站通过 AJAX 获取数据,而无需刷新页面。在这种情况下,你需要拦截这些请求并重现它们。

我们开始实践!

绕过分页并收集数据的脚本示例

我们来看看一个脚本示例:

Python

import requests
from bs4 import BeautifulSoup

# 用于获取单个页面数据的函数
def get_data_from_page(url):
    response = requests.get(url)
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'html.parser')
        # 在这里从 soup 中提取数据 - 示例
        data = soup.find_all('div', class_='data-class')
        for item in data:
            print(item.text)  # 打印或保存数据
    else:
        print(f"无法获取页面: {url}")

# 遍历分页的主要逻辑
def scrape_all_pages(start_url):
    current_url = start_url
    while current_url:
        get_data_from_page(current_url)
        soup = BeautifulSoup(requests.get(current_url).text, 'html.parser')
        # 尝试找到“下一页”链接
        next_button = soup.find('a', text='下一页')
        if next_button:
            current_url = next_button['href']
        else:
            current_url = None

# 从第一页开始爬取
start_url = 'http://example.com/page=1'
scrape_all_pages(start_url)

这是一个基本示例,演示了分页工作的原理。你需要根据你正在处理的网站结构对其进行调整。

管理会话和使用 user-agent

当你向网站发送大量请求时,使用会话和更改 user-agent 是有帮助的,这样可以降低被封锁的风险。

Python

headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

session = requests.Session()
session.headers.update(headers)

response = session.get('http://example.com')

这种构造比仅仅发送空标头的请求更能有效模拟浏览器。

4. 实际实现

现在我们知道了基础知识,让我们稍微增加一点复杂度。假设页面链接包含不可预测的参数,我们需要使用 AJAX 来获取数据。

使用 AJAX 的实现

有时数据不是加载在主页面上,而是通过 AJAX 加载的。如果你发现网站行为如此,请使用浏览器的网络调试工具来确定后台发送了哪些请求。然后使用 Python 重现这些请求。

Python

# AJAX 请求示例
ajax_url = 'http://example.com/ajax_endpoint'

params = {
'some_param': 'value',  # 请求参数,如果需要
'page': 1
}

while True:
response = session.get(ajax_url, params=params)
data = response.json()
if not data['has_more']:
break
# 处理数据
for item in data['items']:
print(item)
params['page'] += 1  # 转到下一页

这种方法在详细分析请求和响应后,对于理解数据在浏览器中的加载方式很有帮助。

今天的讲座让我们深入了解了迷人的但有时麻烦的分页世界。这一技能将使你能够自信而高效地从网站上收集数据,而不会遗漏任何一页。毕竟,就像生活一样,在网络爬虫中,方法和坚持是最重要的,毕竟,谁知道第 20 页上隐藏了什么宝藏呢!

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION