一个自动爬取帖子的爬虫,总是出错
如题。学了一点点皮毛,编了一个爬虫,想实现输入网址,输入关键词,自动翻找帖子,自动复制帖子到一个txt文档中去。结果总是提示没有相关方法。代码附上,还请大神们斧正from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
import time
# 创建 WebDriver 对象,指明使用chrome浏览器驱动
driver = webdriver.Chrome()
# 打开要访问的网页
url = input("请输入要访问的网址:")
driver.get(url)
# 找到搜索输入框,并输入关键词
keyword = input("请输入要搜索的关键词:")
search_box = driver.find_element_by_xpath('//input[@name="keyword"]')
search_box.send_keys(keyword)
search_box.send_keys(Keys.RETURN)
# 创建一个空列表,用于保存搜索结果的标题和内容
results = []
# 循环遍历搜索结果页面,查找关键词
while True:
# 找到所有的搜索结果元素
posts = driver.find_elements_by_xpath('//div[@class="search-list"]/ul/li')
# 遍历搜索结果元素,查找包含关键词的搜索结果
for post in posts:
# 解析搜索结果元素的 HTML 内容
soup = BeautifulSoup(post.get_attribute('innerHTML'), 'html.parser')
# 找到搜索结果元素的标题和内容
title = soup.find('a', class_='title').text.strip()
content = soup.find('p', class_='content').text.strip()
# 如果标题或内容中包含关键词,则将标题和内容添加到结果列表中
if keyword in title or keyword in content:
results.append((title, content))
# 找到帖子第一个发布者写的内容
author_content = soup.find('div', class_='post-item').find('div', class_='post-content').text.strip()
# 将帖子标题和第一个发布者写的内容添加到结果列表中
results.append((title, author_content))
try:
# 找到“下一页”链接元素
next_link = driver.find_element_by_partial_link_text('下一页')
# 点击“下一页”链接
next_link.click()
time.sleep(2)
except:
# 如果没有“下一页”链接,则退出循环
break
# 将结果保存到文件中
with open('results.txt', 'w', encoding='utf-8') as f:
for i, (title, content) in enumerate(results):
f.write(f'[{i+1}] {title}\n{content}\n\n')
# 关闭浏览器
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' 问题出在第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论坛的网页结构发生了变化。 本帖最后由 歌者文明清理员 于 2023-5-14 23:48 编辑
新版selenium发生了一些变化。
from selenium.webdriver.common.by import By
driver.find_element(By.XPATH, '//input[@name="keyword"]')
并且fishc的网页结构也变了,需要重新f12看看,现在是
<input type="text" name="srchtxt" id="scbar_txt" value="请输入搜索内容" autocomplete="off" x-webkit-speech="" speech="" class=" xg1" placeholder="请输入搜索内容">
完整代码:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from bs4 import BeautifulSoup
import time
# 创建 WebDriver 对象,指明使用chrome浏览器驱动
driver = webdriver.Chrome()
# 打开要访问的网页
url = input("请输入要访问的网址:")
driver.get(url)
# 找到搜索输入框,并输入关键词
keyword = input("请输入要搜索的关键词:")
search_box = driver.find_element(By.XPATH, '//input[@id="scbar_txt"]')
search_box.send_keys(keyword)
search_box.send_keys(Keys.RETURN)
# 创建一个空列表,用于保存搜索结果的标题和内容
results = []
# 循环遍历搜索结果页面,查找关键词
while True:
# 找到所有的搜索结果元素
posts = driver.find_elements(By.XPATH, '//div[@class="search-list"]/ul/li')
# 遍历搜索结果元素,查找包含关键词的搜索结果
for post in posts:
# 解析搜索结果元素的 HTML 内容
soup = BeautifulSoup(post.get_attribute('innerHTML'), 'html.parser')
# 找到搜索结果元素的标题和内容
title = soup.find('a', class_='title').text.strip()
content = soup.find('p', class_='content').text.strip()
# 如果标题或内容中包含关键词,则将标题和内容添加到结果列表中
if keyword in title or keyword in content:
results.append((title, content))
# 找到帖子第一个发布者写的内容
author_content = soup.find('div', class_='post-item').find('div', class_='post-content').text.strip()
# 将帖子标题和第一个发布者写的内容添加到结果列表中
results.append((title, author_content))
try:
# 找到“下一页”链接元素
next_link = driver.find_element_by(By.PARTIAL_LINK_TEXT, '下一页')
# 点击“下一页”链接
next_link.click()
time.sleep(2)
except:
# 如果没有“下一页”链接,则退出循环
break
# 将结果保存到文件中
with open('results.txt', 'w', encoding='utf-8') as f:
for i, (title, content) in enumerate(results):
f.write(f'[{i+1}] {title}\n{content}\n\n')
# 关闭浏览器
driver.quit()
isdkz 发表于 2023-5-14 23:29
问题出在第15行,因为WebDriver对象没有find_element_by_xpath方法。解决方法是将该行代码改为:
search_b ...
gpt就是这个问题,不管我怎么设置(联网模式开不开),因为旧代码太多,每次都得手动改
幸好我没用脚本{:10_256:} 同楼上,用By。
页:
[1]