鱼C论坛

 找回密码
 立即注册
查看: 232|回复: 12

[作品展示] 爬fihc.com最新帖子的评论的程序的分享

[复制链接]
发表于 2024-8-28 19:57:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import requests
import bs4
import time
pl = input("请输入要爬取的最新帖子的评论:")
a = 1
payload = {"mod":"guide","view":"newthread","page":1}
res  = requests.get("https://fishc.com.cn/forum.php", params=payload)
sb = bs4.BeautifulSoup(res.text,features="lxml")
mzli = sb.find_all("a",class_="xst")
url = " "
while True:
    res  = requests.get("https://fishc.com.cn/forum.php", params=payload)
    sb = bs4.BeautifulSoup(res.text,features="lxml")
    mzli = sb.find_all("a",class_="xst")
    if not mzli:
        break
    else:
        for i in mzli:
            if i.text == pl:
                url = i["href"]
    payload["page"]+=1
    time.sleep(0.2)
if url == " ":
    raise ValueError()
req = requests.get(url)
bs = bs4.BeautifulSoup(req.text,features="lxml")
ta = bs.find_all("div",class_ = "t_fsz")
for each in ta:
    print(each.table.text)
    print("------------------------------------------------------------")

time.sleep(10)
我无聊写的
有什么修改建议写下面

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-28 19:58:05 | 显示全部楼层
你好,鱼油!你的程序总体思路是正确的,但是有一些地方需要修改和优化。下面是一些建议:

1. **优化爬取机制**:
   - `payload` 是一个字典,你不能直接用 `payload += 1` 来递增页面数。
   - 在查找评论的过程中,你应该在找到帖子 URL 后立刻跳出循环,而不是继续请求页面。

2. **错误处理**:
   - 尽量添加一些异常处理,防止因为网络错误或其他问题导致程序崩溃。

3. **提高可读性**:
   - 使用合适的变量名,使代码更容易理解。

修改后的代码如下:
import requests
import bs4
import time

# 输入要爬取的最新帖子标题
post_title = input("请输入要爬取的最新帖子的评论标题:").strip()

base_url = "https://fishc.com.cn/forum.php"
payload = {"mod": "guide", "view": "newthread", "page": 1}

post_url = None

while True:
    res = requests.get(base_url, params=payload)
    if res.status_code != 200:
        print("请求失败,状态码:", res.status_code)
        break
        
    soup = bs4.BeautifulSoup(res.text, features="lxml")
    post_links = soup.find_all("a", class_="xst")
    
    if not post_links:
        # 如果找不到帖子链接,说明已经到最后一页
        break

    for post_link in post_links:
        if post_link.text.strip() == post_title:
            post_url = post_link.get('href')
            break
    if post_url:
        # 找到了目标帖子 URL,退出循环
        break

    payload['page'] += 1
    time.sleep(0.2)

if post_url:
    # 拼接完整的帖子 URL
    full_post_url = "https://fishc.com.cn/" + post_url
    
    # 获取帖子页面
    req = requests.get(full_post_url)
    if req.status_code != 200:
        print("请求帖子页面失败,状态码:", req.status_code)
    else:
        soup = bs4.BeautifulSoup(req.text, features="lxml")
        comments = soup.find_all("div", class_="t_fsz")
        
        for comment in comments:
            print(comment.get_text(strip=True))
            print("------------------------------------------------------------")
else:
    print("未找到指定标题的帖子")

time.sleep(10)

主要修改点:
1. 使用.strip()去除多余空格。
2. 将 `payload['page'] += 1` 代替 `payload+=1`。
3. 直接拼接 `post_url`,因为 `post_link.get('href')` 可能是相对路径。
4. 增加了对HTTP返回状态码的检查和错误提示。
5. 使用 `soup.get_text(strip=True)` 提取评论内容,以避免格式问题。

希望这些修改能帮助你使代码更加健壮和高效!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-28 20:01:14 | 显示全部楼层
FishC 发表于 2024-8-28 19:58
你好,鱼油!你的程序总体思路是正确的,但是有一些地方需要修改和优化。下面是一些建议:

1. **优化爬 ...

你的用不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-28 20:03:30 | 显示全部楼层


抱歉之前的解释不够具体,我们来调整和优化你的代码:

1. 修正 `payload` 递增的方式。
2. 使用 `.format()` 或 `f-string` 来构建新帖子的 URL。
3. 改进错误处理和增强可读性。
4. 添加必要的头部信息和错误处理,确保连接不会因为频繁请求被阻断。

下面是修正后的代码:
import requests
from bs4 import BeautifulSoup
import time

# 输入帖子标题
pl = input("请输入要爬取的最新帖子的评论:")

# 初始页码设定
page_num = 1
url = None

# 设置会话和请求头,模拟浏览器
session = requests.Session()
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}

while page_num <= 10:  # 限制爬取页数,例如只爬取前10页
    payload = {"mod": "guide", "view": "newthread", "page": page_num}
    res = session.get("https://fishc.com.cn/forum.php", headers=headers, params=payload)

    # 检查请求是否成功
    if res.status_code != 200:
        print(f"请求第 {page_num} 页失败,状态码:{res.status_code}")
        break

    sb = BeautifulSoup(res.text, "lxml")
    mzli = sb.find_all("a", class_="xst")

    # 检查是否找到帖子
    found = False
    for i in mzli:
        if i.text == pl:
            url = "https://fishc.com.cn/" + i['href']
            found = True
            break

    if found:
        break

    page_num += 1
    time.sleep(0.5)  # 避免频繁请求被封禁

if not url:
    raise ValueError("未找到指定的帖子")

# 获取评论
req = session.get(url, headers=headers)
bs = BeautifulSoup(req.text, "lxml")
ta = bs.find_all("div", class_="t_fsz")

for each in ta:
    print(each.table.text.strip())
    print("------------------------------------------------------------")

time.sleep(10)

### 修改要点:
1. **页码递增**:使用 `page_num` 变量来递增页码。
2. **检查请求状态码**:每次请求后检查返回的状态码,如果请求失败则输出错误信息并中止循环。
3. **组合URL**:当找到匹配的帖子时,组合完整的帖子URL进行下一步请求。
4. **错误处理**:如果找不到指定帖子,会抛出一个明确的错误信息。
5. **调整请求间隔**:增加请求间隔以避免频繁请求造成 IP 被封禁。

调整后的代码更具鲁棒性,可读性也提高了。希望这些修改能帮到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-29 09:10:24 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-29 09:11:09 | 显示全部楼层

回帖奖励 +1 鱼币

没啥建议
单纯领个币
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-29 09:13:56 | 显示全部楼层
头请求和会话是什么
@fishc
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-29 09:14:08 | 显示全部楼层
zxbin1 发表于 2024-08-29 09:13
头请求和会话是什么
@fishc


头请求(HEAD)是一种HTTP请求方法,用于获取服务器资源的头部信息,而不获取资源本身的内容。它常用于检查资源是否存在或获取其元数据,例如文件大小或最后修改时间。

会话(Session)是一种在客户端和服务器之间保持状态的方法。会话通常通过cookie或其他机制跟踪某个用户的多个请求,使得服务器可以识别连续请求来自同一个用户。

希望这个解释对你有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-29 09:22:30 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-29 15:17:31 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-31 16:36:39 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-31 16:38:20 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-9-1 09:50:22 | 显示全部楼层
看看,学习下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 20:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表