如何使用 Python 搜刮 Medium 上的文章

评论: 0

从 Medium 中提取文章对于内容评估、数据收集或监控作者及其作品等目的而言至关重要。在本教程中,我们将学习如何使用 python 编程语言抓取 Medium - 一个面向作家的文章网站。我们将讨论如何从 Medium 文章的给定 Web URL 中提取文章标题、作者姓名、出版物名称和正文本身等数据。

要求

在本教程中,我们将从 Medium 上抓取这篇文章:"9 个可显著优化代码的 Python 内置装饰器"。

在开始之前,请安装以下库:

  • Requests: 向 Medium 发送 HTTP 请求。
  • lxml: 用于解析 HTML 内容。
  • Pandas: 将数据保存为 CSV 文件。

使用以下命令安装它们:


pip install requests
pip install lxml 
pip install pandas

了解页眉和代理的重要性

Medium 使用僵尸检测技术来防止未经授权的刮擦。适当的标头和代理对于避免僵尸检测和负责任的刮擦至关重要。

头信息:这些信息将请求模拟为来自真实浏览器的请求。它们包括浏览器类型、可接受的内容类型和缓存行为等信息。


headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}

代理:代理可以屏蔽您的 IP 地址,并定期轮换,以降低请求被 Medium 屏蔽的可能性。下面是一个使用 IP 地址验证的示例:


proxies = {
    'http': 'IP:PORT',
    'https': 'IP:PORT'
}

response = requests.get(
 'https://medium.com/techtofreedom/9-python-built-in-decorators-that-optimize-your-code-significantly-bc3f661e9017',
    headers=headers,
    proxies=proxies
)

向 Medium 发送请求

以下是如何设置标头并向文章 URL 发送请求:


import requests

# 标头,以模拟真实的浏览器请求
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}

url = 'https://medium.com/techtofreedom/9-python-built-in-decorators-that-optimize-your-code-significantly-bc3f661e9017'
response = requests.get(url, headers=headers)

提取数据

获得页面内容后,我们就可以对其进行解析并提取相关信息。

解析 HTML 内容

我们将使用 lxml 来解析 HTML 响应并提取特定元素。以下是具体操作方法:


from lxml.html import fromstring

parser = fromstring(response.text)

# 提取数据
title = parser.xpath('//h1[@data-testid="storyTitle"]/text()')[0]
author = parser.xpath('//a[@data-testid="authorName"]/text()')[0]
publication_name = parser.xpath('//a[@data-testid="publicationName"]/p/text()')[0]
publication_date = parser.xpath('//span[@data-testid="storyPublishDate"]/text()')[0]
content = '\n '.join(parser.xpath('//div[@class="ci bh ga gb gc gd"]/p/text()'))
auth_followers = parser.xpath('//span[@class="pw-follower-count bf b bg z bk"]/a/text()')[0]
sub_title = parser.xpath('//h2[@id="1de6"]/text()')[0]

现在,我们将创建一个字典来保存所有提取的数据。这样可以更方便地保存到 CSV 文件中。


# 将数据保存在字典中
article_data = {
    'Title': title,
    'Author': author,
    'Publication': publication_name,
    'Date': publication_date,
    'Followers': auth_followers,
    'Subtitle': sub_title,
    'Content': content,
}

print(article_data)

将数据保存到 CSV 文件

最后,让我们将数据保存到 CSV 文件,以便进一步分析或保存记录。


import pandas as pd

# 将字典转换为 DataFrame 并保存为 CSV
df = pd.DataFrame([article_data])
df.to_csv('medium_article_data.csv', index=False)
print("Data saved to medium_article_data.csv")

完整代码

以下是抓取 Medium 文章数据的完整代码:


import requests
from lxml.html import fromstring
import pandas as pd

# 模仿浏览器的标题
headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'cache-control': 'no-cache',
    'dnt': '1',
    'pragma': 'no-cache',
    'priority': 'u=0, i',
    'sec-ch-ua': '"Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36',
}


proxies = {
    'http': 'IP:PORT',
    'https': 'IP:PORT'
}

# 申请页面
url = 'https://medium.com/techtofreedom/9-python-built-in-decorators-that-optimize-your-code-significantly-bc3f661e9017'
response = requests.get(url, headers=headers, proxies=proxies)

# 解析页面
parser = fromstring(response.text)

# 提取数据
title = parser.xpath('//h1[@data-testid="storyTitle"]/text()')[0]
author = parser.xpath('//a[@data-testid="authorName"]/text()')[0]
publication_name = parser.xpath('//a[@data-testid="publicationName"]/p/text()')[0]
publication_date = parser.xpath('//span[@data-testid="storyPublishDate"]/text()')[0]
content = '\n '.join(parser.xpath('//div[@class="ci bh ga gb gc gd"]/p/text()'))
auth_followers = parser.xpath('//span[@class="pw-follower-count bf b bg z bk"]/a/text()')[0]
sub_title = parser.xpath('//h2[@id="1de6"]/text()')[0]

# 保存数据
article_data = {
    'Title': title,
    'Author': author,
    'Publication': publication_name,
    'Date': publication_date,
    'Followers': auth_followers,
    'Subtitle': sub_title,
    'Content': content,
}

# 保存为 CSV
df = pd.DataFrame([article_data])
df.to_csv('medium_article_data.csv', index=False)
print("Data saved to medium_article_data.csv")

从 Medium 上抓取内容应负责任地进行。服务器上过多的请求负载会影响服务性能,而未经许可的数据搜刮可能会违反网站的使用条款。在抓取任何网站内容之前,请务必检查 robots.txt 文件和条款。

评论:

0 评论