爬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)
我无聊写的
有什么修改建议写下面 你好,鱼油!你的程序总体思路是正确的,但是有一些地方需要修改和优化。下面是一些建议:
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 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-8-28 19:58
你好,鱼油!你的程序总体思路是正确的,但是有一些地方需要修改和优化。下面是一些建议:
1. **优化爬 ...
你的用不了 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 小助理,如未能正确解答您的问题,请继续追问。 没啥建议
单纯领个币 头请求和会话是什么
@fishc zxbin1 发表于 2024-08-29 09:13
头请求和会话是什么
@fishc
头请求(HEAD)是一种HTTP请求方法,用于获取服务器资源的头部信息,而不获取资源本身的内容。它常用于检查资源是否存在或获取其元数据,例如文件大小或最后修改时间。
会话(Session)是一种在客户端和服务器之间保持状态的方法。会话通常通过cookie或其他机制跟踪某个用户的多个请求,使得服务器可以识别连续请求来自同一个用户。
希望这个解释对你有帮助!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 {:5_108:} {:9_228:} {:10_256:}{:10_256:} {:10_256:}{:10_256:} 看看,学习下{:10_254:}
页:
[1]