今天还没登录领原石,但又想看攻略帖子和看图吃瓜。于是我默默打开浏览器和PyCharm
找到自己的cookie
贴上美食
import requests
from bs4 import BeautifulSoup
import pprint
import json
import pandas as pd
import os
from docx import Document
from docx.shared import Inches
#cookie自己改一下,不改你用不了,坏蛋
url = "https://bbs-api.miyoushe.com/post/wapi/getForumPostList"
headers={
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36 Edg/124.0.0.0",
"X-Rpc-App_version":"2.70.0",
"X-Rpc-Client_type":"4",
"X-Rpc-Device_fp":"38d7f9c091ca3",
"X-Rpc-Device_id":"0bfb03a9246518991fcb49470b60151d""",
"Referer":"https://www.miyoushe.com/",
"Cookie":"cookie_token=q6k47y0jyN5yDynBdxSuwnOoUfTTTpXVGLYWV; account_id=30401680; ltoken=tRyMTatmtoQCOL0iNZgerJgUJlsMNCBAohfHzNOh; ltuid=30401680; cookie_token_v2=v2_dBSMnf3PmSE6htFffPh1rxlbZPUO8rAXndZ8bDU7wFoHHIE1uraSpiiPYwBLH-NVHsK4_LGLJ_f3ZsvJ82mMn8S7KDpyIiCka_IsJs5BRUGNzyZeqjOPFweVEr91caCBjcg=; account_mid_v2=0z336s1cdq_mhy; account_id_v2=30401680; ltoken_v2=v2_c-Q55ajaxXvJhhY5d151S7GtJW1OnFIDdUvrbM5Gg-MNSj8dIUB_3XoGTbmiHpGV0wFlOl09N5SMVs28iG8s7zviWTliGUNCwIX93RQhis2LA3w1_kYGGkjq5EV_HUEfEg==; ltmid_v2=0z336s1cdq_mhy; ltuid_v2=30401680; _MHYUUID=1e4f74db-10d1-4e79-88c2-6bef37ad1fc6; DEVICEFP_SEED_ID=430c3d7936a8b4aa; DEVICEFP_SEED_TIME=1714005305746; DEVICEFP=38d7f9c091ca3; _ga=GA1.1.1328637567.1714005306; acw_tc=ac11000117140053122492606eeedc719eea0d85349bdc1161768e634d16d4; _ga_KS4J8TXSHQ=GS1.1.1714005306.1.1.1714005388.0.0.0"
}
"""
forum_id: 表示您想要获取帖子数据的论坛ID。在这个例子中,值为50,意味着您正在请求论坛ID为50的论坛上的帖子信息。这个参数决定了您要访问哪个具体的论坛板块。
gids: 代表游戏ID。值为2,意味着您正在请求与游戏ID为2相关的帖子。这有助于过滤出特定游戏社区的讨论内容,确保返回的帖子都是关于该游戏的。
is_good 和 is_hot: 这两个参数分别表示是否只展示被标记为“精华”(优秀)的帖子(is_good="true")和是否只展示热门帖子(is_hot="true")。在您提供的示例中,这两个参数都被设置为"false",表示不进行这类筛选,返回所有普通帖子。
last_id: 通常用于分页加载数据时指定上一次请求返回数据中的最后一个帖子ID。值为"1713983516.638826",表示您希望从这个帖子之后开始获取新的帖子数据。如果首次请求,可以留空或者使用默认值;后续请求时,使用上一次请求返回的最后一个帖子ID,以便服务器返回下一页的内容。
page_size: 指定每次请求返回的帖子数量。值为20,表示您希望每次请求获取20篇帖子。这个参数用于控制数据分页的大小,以避免一次性加载过多数据导致响应时间过长或资源浪费。
sort_type: 定义帖子排序方式。虽然您提供的示例中未明确说明各个数值对应的排序类型,但通常情况下,这个参数可能会用来指定按发布时间、热度、回复数等属性进行升序或降序排列。值为1,假设其代表一种特定的排序规则,如按发布时间从新到旧排序。
"""
params = {
"forum_id": "50",
"gids": "2",
"is_good": "true",
"is_hot": "true",
"last_id": "1713983516.638826",
"page_size": 300,
"sort_type": 1
}
resp = requests.get(url, params=params, headers=headers)
#print(resp.status_code)
#print(resp.text)
data = json.loads(resp.text)
"""
post_subject_content_and_cover = [(post['post']['subject'], post['post']['content'], post['post']['cover']) for post in data['data']['list']]
# 打印post_subject_content_and_cover
for subject, content, cover in post_subject_content_and_cover:
print(f"题目: {subject}")
print(f"内容: {content}")
print(f"图片: {cover}\n")
"""
# 创建Word文档
doc = Document()
# 下载并插入cover图片
for post in data['data']['list']:
cover_url = post['post']['cover']
cover_filename = os.path.join('D:/东软学习/爬虫练习/craw/web_soul', cover_url.split('/')[-1])
# 下载图片
if not (cover_url.startswith("http://") or cover_url.startswith("https://")) and "." not in cover_url:
print(f"空白(有些帖子没发图片): {cover_url}")
continue
# 添加协议前缀(如果缺少)
if not cover_url.startswith("http"):
cover_url = f"https://{cover_url}"
response = requests.get(cover_url, stream=True)
if response.status_code == 200:
with open(cover_filename, 'wb') as f:
f.write(response.content)
else:
print(f"Failed to download cover image: {cover_url} (Status code: {response.status_code})")
# 插入图片到Word文档
if os.path.exists(cover_filename):
doc.add_picture(cover_filename, width=Inches(4))
# 添加subject和content到Word文档
doc.add_paragraph(post['post']['subject'], style='Heading 1')
doc.add_paragraph(post['post']['content'])
# 保存Word文档
doc.save('米游社.docx')
拉满了,还望给个点赞和收藏!!!!