鱼C论坛

 找回密码
 立即注册
查看: 915|回复: 5

[已解决]一个自动爬取帖子的爬虫,总是出错

[复制链接]
发表于 2023-5-14 23:29:19 | 显示全部楼层 |阅读模式

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

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

x
如题。学了一点点皮毛,编了一个爬虫,想实现输入网址,输入关键词,自动翻找帖子,自动复制帖子到一个txt文档中去。结果总是提示没有相关方法。代码附上,还请大神们斧正

  1. from selenium import webdriver
  2. from selenium.webdriver.common.keys import Keys
  3. from bs4 import BeautifulSoup
  4. import time

  5. # 创建 WebDriver 对象,指明使用chrome浏览器驱动
  6. driver = webdriver.Chrome()

  7. # 打开要访问的网页
  8. url = input("请输入要访问的网址:")
  9. driver.get(url)

  10. # 找到搜索输入框,并输入关键词
  11. keyword = input("请输入要搜索的关键词:")
  12. search_box = driver.find_element_by_xpath('//input[@name="keyword"]')
  13. search_box.send_keys(keyword)
  14. search_box.send_keys(Keys.RETURN)

  15. # 创建一个空列表,用于保存搜索结果的标题和内容
  16. results = []

  17. # 循环遍历搜索结果页面,查找关键词
  18. while True:
  19.     # 找到所有的搜索结果元素
  20.     posts = driver.find_elements_by_xpath('//div[@class="search-list"]/ul/li')
  21.     # 遍历搜索结果元素,查找包含关键词的搜索结果
  22.     for post in posts:
  23.         # 解析搜索结果元素的 HTML 内容
  24.         soup = BeautifulSoup(post.get_attribute('innerHTML'), 'html.parser')
  25.         # 找到搜索结果元素的标题和内容
  26.         title = soup.find('a', class_='title').text.strip()
  27.         content = soup.find('p', class_='content').text.strip()
  28.         # 如果标题或内容中包含关键词,则将标题和内容添加到结果列表中
  29.         if keyword in title or keyword in content:
  30.             results.append((title, content))
  31.             # 找到帖子第一个发布者写的内容
  32.             author_content = soup.find('div', class_='post-item').find('div', class_='post-content').text.strip()
  33.             # 将帖子标题和第一个发布者写的内容添加到结果列表中
  34.             results.append((title, author_content))
  35.     try:
  36.         # 找到“下一页”链接元素
  37.         next_link = driver.find_element_by_partial_link_text('下一页')
  38.         # 点击“下一页”链接
  39.         next_link.click()
  40.         time.sleep(2)
  41.     except:
  42.         # 如果没有“下一页”链接,则退出循环
  43.         break

  44. # 将结果保存到文件中
  45. with open('results.txt', 'w', encoding='utf-8') as f:
  46.     for i, (title, content) in enumerate(results):
  47.         f.write(f'[{i+1}] {title}\n{content}\n\n')

  48. # 关闭浏览器
  49. driver.quit()
复制代码


我输入鱼C的网址:https://fishc.com.cn/forum-173-1.html
输入关键词:爬虫

结果返回的错误信息如下:

Traceback (most recent call last):
  File "D:\Python学习\Cursor\爬虫\指定网址指定关键词\mian.py", line 15, in <module>
    search_box = driver.find_element_by_xpath('//input[@name="keyword"]')
AttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'
最佳答案
2023-5-14 23:31:27
本帖最后由 歌者文明清理员 于 2023-5-14 23:48 编辑

新版selenium发生了一些变化。
  1. from selenium.webdriver.common.by import By
  2. driver.find_element(By.XPATH, '//input[@name="keyword"]')
复制代码

并且fishc的网页结构也变了,需要重新f12看看,现在是
  1. <input type="text" name="srchtxt" id="scbar_txt" value="请输入搜索内容" autocomplete="off" x-webkit-speech="" speech="" class=" xg1" placeholder="请输入搜索内容">
复制代码

完整代码:
  1. from selenium import webdriver
  2. from selenium.webdriver.common.keys import Keys
  3. from selenium.webdriver.common.by import By
  4. from bs4 import BeautifulSoup
  5. import time

  6. # 创建 WebDriver 对象,指明使用chrome浏览器驱动
  7. driver = webdriver.Chrome()

  8. # 打开要访问的网页
  9. url = input("请输入要访问的网址:")
  10. driver.get(url)

  11. # 找到搜索输入框,并输入关键词
  12. keyword = input("请输入要搜索的关键词:")
  13. search_box = driver.find_element(By.XPATH, '//input[@id="scbar_txt"]')
  14. search_box.send_keys(keyword)
  15. search_box.send_keys(Keys.RETURN)

  16. # 创建一个空列表,用于保存搜索结果的标题和内容
  17. results = []

  18. # 循环遍历搜索结果页面,查找关键词
  19. while True:
  20.     # 找到所有的搜索结果元素
  21.     posts = driver.find_elements(By.XPATH, '//div[@class="search-list"]/ul/li')
  22.     # 遍历搜索结果元素,查找包含关键词的搜索结果
  23.     for post in posts:
  24.         # 解析搜索结果元素的 HTML 内容
  25.         soup = BeautifulSoup(post.get_attribute('innerHTML'), 'html.parser')
  26.         # 找到搜索结果元素的标题和内容
  27.         title = soup.find('a', class_='title').text.strip()
  28.         content = soup.find('p', class_='content').text.strip()
  29.         # 如果标题或内容中包含关键词,则将标题和内容添加到结果列表中
  30.         if keyword in title or keyword in content:
  31.             results.append((title, content))
  32.             # 找到帖子第一个发布者写的内容
  33.             author_content = soup.find('div', class_='post-item').find('div', class_='post-content').text.strip()
  34.             # 将帖子标题和第一个发布者写的内容添加到结果列表中
  35.             results.append((title, author_content))
  36.     try:
  37.         # 找到“下一页”链接元素
  38.         next_link = driver.find_element_by(By.PARTIAL_LINK_TEXT, '下一页')
  39.         # 点击“下一页”链接
  40.         next_link.click()
  41.         time.sleep(2)
  42.     except:
  43.         # 如果没有“下一页”链接,则退出循环
  44.         break

  45. # 将结果保存到文件中
  46. with open('results.txt', 'w', encoding='utf-8') as f:
  47.     for i, (title, content) in enumerate(results):
  48.         f.write(f'[{i+1}] {title}\n{content}\n\n')

  49. # 关闭浏览器
  50. driver.quit()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-14 23:29:44 | 显示全部楼层
问题出在第15行,因为WebDriver对象没有find_element_by_xpath方法。解决方法是将该行代码改为:

search_box = driver.find_element_by_name('srchtxt')

同时,需要将第29行的xpath表达式改为:

'//div[@class="showContent"]/div[@class="showContentMain"]/div[@class="showContentWrap"]/div[@class="showContentLeft"]/div[@class="showContentLeftContent"]/div[@class="showContentLeftContentInner"]'

这是因为鱼C论坛的网页结构发生了变化。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-14 23:31:27 | 显示全部楼层    本楼为最佳答案   
本帖最后由 歌者文明清理员 于 2023-5-14 23:48 编辑

新版selenium发生了一些变化。
  1. from selenium.webdriver.common.by import By
  2. driver.find_element(By.XPATH, '//input[@name="keyword"]')
复制代码

并且fishc的网页结构也变了,需要重新f12看看,现在是
  1. <input type="text" name="srchtxt" id="scbar_txt" value="请输入搜索内容" autocomplete="off" x-webkit-speech="" speech="" class=" xg1" placeholder="请输入搜索内容">
复制代码

完整代码:
  1. from selenium import webdriver
  2. from selenium.webdriver.common.keys import Keys
  3. from selenium.webdriver.common.by import By
  4. from bs4 import BeautifulSoup
  5. import time

  6. # 创建 WebDriver 对象,指明使用chrome浏览器驱动
  7. driver = webdriver.Chrome()

  8. # 打开要访问的网页
  9. url = input("请输入要访问的网址:")
  10. driver.get(url)

  11. # 找到搜索输入框,并输入关键词
  12. keyword = input("请输入要搜索的关键词:")
  13. search_box = driver.find_element(By.XPATH, '//input[@id="scbar_txt"]')
  14. search_box.send_keys(keyword)
  15. search_box.send_keys(Keys.RETURN)

  16. # 创建一个空列表,用于保存搜索结果的标题和内容
  17. results = []

  18. # 循环遍历搜索结果页面,查找关键词
  19. while True:
  20.     # 找到所有的搜索结果元素
  21.     posts = driver.find_elements(By.XPATH, '//div[@class="search-list"]/ul/li')
  22.     # 遍历搜索结果元素,查找包含关键词的搜索结果
  23.     for post in posts:
  24.         # 解析搜索结果元素的 HTML 内容
  25.         soup = BeautifulSoup(post.get_attribute('innerHTML'), 'html.parser')
  26.         # 找到搜索结果元素的标题和内容
  27.         title = soup.find('a', class_='title').text.strip()
  28.         content = soup.find('p', class_='content').text.strip()
  29.         # 如果标题或内容中包含关键词,则将标题和内容添加到结果列表中
  30.         if keyword in title or keyword in content:
  31.             results.append((title, content))
  32.             # 找到帖子第一个发布者写的内容
  33.             author_content = soup.find('div', class_='post-item').find('div', class_='post-content').text.strip()
  34.             # 将帖子标题和第一个发布者写的内容添加到结果列表中
  35.             results.append((title, author_content))
  36.     try:
  37.         # 找到“下一页”链接元素
  38.         next_link = driver.find_element_by(By.PARTIAL_LINK_TEXT, '下一页')
  39.         # 点击“下一页”链接
  40.         next_link.click()
  41.         time.sleep(2)
  42.     except:
  43.         # 如果没有“下一页”链接,则退出循环
  44.         break

  45. # 将结果保存到文件中
  46. with open('results.txt', 'w', encoding='utf-8') as f:
  47.     for i, (title, content) in enumerate(results):
  48.         f.write(f'[{i+1}] {title}\n{content}\n\n')

  49. # 关闭浏览器
  50. driver.quit()
复制代码

点评

我很赞同!: 5.0
我很赞同!: 5
  发表于 2023-5-14 23:38
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-5-14 23:41:09 | 显示全部楼层
isdkz 发表于 2023-5-14 23:29
问题出在第15行,因为WebDriver对象没有find_element_by_xpath方法。解决方法是将该行代码改为:

search_b ...

gpt就是这个问题,不管我怎么设置(联网模式开不开),因为旧代码太多,每次都得手动改
幸好我没用脚本
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-15 06:53:02 From FishC Mobile | 显示全部楼层
同楼上,用By。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 19:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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