鱼C论坛

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

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

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

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

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

x

  1. import requests
  2. import bs4
  3. import time
  4. pl = input("请输入要爬取的最新帖子的评论:")
  5. a = 1
  6. payload = {"mod":"guide","view":"newthread","page":1}
  7. res  = requests.get("https://fishc.com.cn/forum.php", params=payload)
  8. sb = bs4.BeautifulSoup(res.text,features="lxml")
  9. mzli = sb.find_all("a",class_="xst")
  10. url = " "
  11. while True:
  12.     res  = requests.get("https://fishc.com.cn/forum.php", params=payload)
  13.     sb = bs4.BeautifulSoup(res.text,features="lxml")
  14.     mzli = sb.find_all("a",class_="xst")
  15.     if not mzli:
  16.         break
  17.     else:
  18.         for i in mzli:
  19.             if i.text == pl:
  20.                 url = i["href"]
  21.     payload["page"]+=1
  22.     time.sleep(0.2)
  23. if url == " ":
  24.     raise ValueError()
  25. req = requests.get(url)
  26. bs = bs4.BeautifulSoup(req.text,features="lxml")
  27. ta = bs.find_all("div",class_ = "t_fsz")
  28. for each in ta:
  29.     print(each.table.text)
  30.     print("------------------------------------------------------------")

  31. time.sleep(10)
复制代码

我无聊写的
有什么修改建议写下面

本帖被以下淘专辑推荐:

相关帖子

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

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

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

修改后的代码如下:

  1. import requests
  2. import bs4
  3. import time

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

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

  8. post_url = None

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

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

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

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

  47. 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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

1. **优化爬 ...

你的用不了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

下面是修正后的代码:

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import time

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

  6. # 初始页码设定
  7. page_num = 1
  8. url = None

  9. # 设置会话和请求头,模拟浏览器
  10. session = requests.Session()
  11. headers = {
  12.     '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'
  13. }

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

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

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

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

  30.     if found:
  31.         break

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

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

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

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

  43. time.sleep(10)
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +1 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +1 鱼币

没啥建议
单纯领个币
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-29 09:13:56 | 显示全部楼层
头请求和会话是什么
@fishc
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

回帖奖励 +1 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +1 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

回帖奖励 +1 鱼币

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-8-31 16:38:20 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-9-1 09:50:22 | 显示全部楼层
看看,学习下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-11 04:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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