这是 Python,而这是你熟悉的网站
这是一篇关于爬虫的文章,当然这篇文章并不是教大家去写爬虫程序,当然有兴趣的也可以学习一下有关爬虫和反爬虫的知识。
另外我还搭建了个网站,此次爬取文章的目的就是为了丰富网站的内容。防止我那弱不禁风、一碰即碎的网站被不怀好意之人给噶了,所以网址我就不透露给大家了。
1. 寻找目标
2. 分析网页
首先我们要获取的是文章的数据,所以我们随便点击一篇文章,并开启开发者工具,点击刷新,点击网络(Network)选项卡中,然后点击 Fetch/XHR
,这样我们能指定获取的是通过 Fetch 或者是 XHR 来发起的请求。
而首页的随机推送正好符合我们的需求,所以下面我们还要爬取首页的内容。
在首页打开开发者面板,点击刷新,在网络(Network)选项卡中,在过滤器输入框中输入 recommend_all_feed
关键词,我们可以找到这样一条信息。它的响应内容与主页上的推荐文章对应。这就是我们要找的请求,应该重点关注。
观察返回的数据结构。其中有文章的 ID、还有摘要,以及作者的信息。返回的文章的总条数为 20 条,多出来的两条是因为插入了 item_type: 14
的这两条数据,这个我们应该将其忽略。
3. 编写爬虫
首先是爬取首页的随机推送文章数据。我下面这段代码是 GPT 生成的,稍作修改得到的。
def getArticleInfo():
response = requests.post(url=url, params={
"aid": 2608,
"uuid": 7308645204243498534,
"spider": 0,
}, json={
"client_type": 2608,
"cursor": "0",
"id_type": 2,
"limit": 20,
"sort_type": 200
})
# 检查请求是否成功
if response.status_code == 200:
data = json.loads(response.content)
infos = data["data"]
ids = []
for i in range(0, len(infos)):
if infos[i]["item_type"] != 2:
continue
info = infos[i]["item_info"]["article_info"]
# 获取文章的标题、ID 和摘要
ids.append({
"title": info["title"],
"article_id": info["article_id"],
"brief_content": info["brief_content"],
})
return ids
else:
# 请求失败,打印错误信息
print(f'请求失败,状态码:{response.status_code}')
在上面出现了三个字段,是我们通过分析后端接口返回的 JSON 数据得出的,其中 brief_content
是文章的摘要。
获取到了文章的 ID 之后,我们还要再请求获取文章数据的接口。由于文章的内容是在 HTML 标签中的,所以我们也只能获取到带有 HTML 标签的内容,因为我们通常会将其渲染在浏览器中进行浏览,同时为了保持文章的格式。
def getArticleContent(article_id):
response = requests.get(url=f'{article_url}{article_id}', json={
"cursor": "0",
"id_type": 2,
"item_id": str(article_id),
"limit": 15,
"referer": "",
"user_id": "1442193974505742"
})
soup = BeautifulSoup(response.content, 'lxml')
article_tag = soup.find(id="article-root")
if article_tag is None:
raise Exception("爬虫被发现了!")
article_all_tags = article_tag.find_all(True)
# 遍历文档中的所有标签
for tag in article_all_tags: # True 表示匹配所有标签
# 遍历标签的所有属性
for attr in list(tag.attrs):
# 检查属性名是否以 'data-' 开头
if attr.startswith('data-'):
# 删除以 'data-' 开头的属性
del tag[attr]
return str(article_tag)
解释一下,其中在返回的 HTML 文档中有一个 id 为 article-root
的标签,这个标签是文章的内容的根标签,我们直接保存这个标签及下的子标签即可。
另外你还会看到删除 data-
开头的属性的代码,这是因为这些属性在我们的网页中并没有用处。因为我们的并不具备原网页的 css 或 script,并不能使其发挥作用。
获取到文章数据后,你可以将其保存到数据库中或者直接将返回的 HTML 文档写入到本地的 HTML 文件中进行保存。
下面是源代码,稍作修改即可运行
转载自:https://juejin.cn/post/7359077619726680105