zxbin1 发表于 2024-8-28 19:57:54

爬fihc.com最新帖子的评论的程序的分享


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)

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

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

zxbin1 发表于 2024-8-28 20:01:14

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

1. **优化爬 ...

你的用不了

FishC 发表于 2024-8-28 20:03:30

zxbin1 发表于 2024-08-28 20:01
你的用不了

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

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 小助理,如未能正确解答您的问题,请继续追问。

zsy0226 发表于 2024-8-29 09:10:24

zsy0226 发表于 2024-8-29 09:11:09

没啥建议
单纯领个币

zxbin1 发表于 2024-8-29 09:13:56

头请求和会话是什么
@fishc

FishC 发表于 2024-8-29 09:14:08

zxbin1 发表于 2024-08-29 09:13
头请求和会话是什么
@fishc

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

sunshine_8205 发表于 2024-8-29 09:22:30

{:5_108:}

111000m 发表于 2024-8-29 15:17:31

{:9_228:}

简柠啦 发表于 2024-8-31 16:36:39

{:10_256:}{:10_256:}

简柠啦 发表于 2024-8-31 16:38:20

{:10_256:}{:10_256:}

trinityee 发表于 2024-9-1 09:50:22

看看,学习下{:10_254:}
页: [1]
查看完整版本: 爬fihc.com最新帖子的评论的程序的分享