鱼C论坛

 找回密码
 立即注册
查看: 1685|回复: 10

[已解决]selenium

[复制链接]
发表于 2023-6-30 16:40:29 | 显示全部楼层 |阅读模式

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

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

x
请问各位大佬,我这个代码为什么运行起来,浏览器一闪而过,也没有爬取到任何数据,这是为什么呢
import time

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from urllib.parse import urljoin
import logging
logging.basicConfig(level=logging.INFO,format='%(asctime)s - %(levelname)s: %(message)s')
INDEX_URL = 'https://spa2.scrape.center/page/{}'
TIME_OUT = 10
PAGE = 10
#初始化浏览器对象
path = 'D:/技能/chromedriver.exe'
brower = webdriver.Chrome(executable_path=path)
#显式等待
wait = WebDriverWait(brower,TIME_OUT)

#发起请求
def scrape_page(url,condition,locator):
    logging.info('正在爬取:{}'.format(url))
    try:
        brower.get(url)
        
        wait.until(condition(locator))#调用wait的until方法,并传入判断条件
    except TimeoutException:
        logging.error('error occurred while scraping {}'.format(url),exc_info=True)

#加载列表页
def scrape_index(page):
    url = INDEX_URL.format(page)
    scrape_page(url,condition=EC.visibility_of_all_elements_located,locator=(By.CSS_SELECTOR,'#index .item'))

#解析列表页
def parse_index():
    elements = brower.find_elements(By.CSS_SELECTOR,'#index .item .name')
    for element in elements:
        #提取属性
        href = element.get_attribute('href')
        yield urljoin(INDEX_URL,href)

def main():
    try:
        for page in range(1,PAGE+1):
            scrape_index(page)
            detail_urls = parse_index()
            logging.info('详情页地址:{}'.format(detail_urls))
    finally:
        brower.close()

if __name__ == '__main()__':
    main()
最佳答案
2023-6-30 16:43:21
看起来你的代码应该是正确的,但你可能忽略了一点,就是你在 if __name__ == '__main__': 后面多了一个括号。正确的写法应该是  if __name__ == '__main__': ,而不是  if __name__ == '__main__()': 。

这是因为, if __name__ == '__main__':  是Python中常用的用于判断当前脚本是否作为主程序运行的语句。 '__main__' 是当前模块的名字,当模块被直接运行时模块名为  '__main__' 。当你错误地写成  '__main__()' 时,Python就无法正确判断当前脚本是否为主程序,所以main()函数就没有被调用,导致了你的代码没有按预期运行。

你只需要删除这个括号,代码应该就可以正常运行了:
if __name__ == '__main__':
    main()

还有一点需要注意,你在调用 scrape_index(page) 后直接调用了 parse_index() ,这可能会在页面还没有完全加载的时候就开始解析,可能导致爬取失败。你可以试试将 parse_index() 放在 scrape_index(page) 的内部,在确认页面加载完毕后再开始解析。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-30 16:41:16 | 显示全部楼层
根据你提供的代码,可能是由于以下原因导致浏览器一闪而过,并没有爬取到任何数据:

  • chromedriver路径错误:请确保path变量指定的chromedriver.exe文件的路径是正确的。你可以检查一下路径是否正确,或者将chromedriver.exe文件放置在与代码文件相同的目录下。
  • 页面加载超时:你设置了一个10秒的超时时间(TIME_OUT),如果网页加载时间超过10秒,就会抛出TimeoutException异常。你可以尝试增加超时时间,例如改为30秒,看能否解决问题。
  • 元素定位失败:在scrape_page函数中,使用了等待条件EC.visibility_of_all_elements_located来等待元素的可见性,但可能由于定位的元素选择器有误,导致元素无法找到。你可以通过检查页面元素的选择器,确认它们是否正确,并且能够唯一地定位到需要的元素。
  • main函数中的if判断错误:注意代码最后一行if __name__ == '__main__()':应该改为if __name__ == '__main__':,去掉多余的括号。


希望以上信息能够帮助你解决问题。如果问题仍然存在,请提供更多细节或错误信息,以便我能够更好地帮助你。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 16:42:02 | 显示全部楼层
歌者文明清理员 发表于 2023-6-30 16:41
根据你提供的代码,可能是由于以下原因导致浏览器一闪而过,并没有爬取到任何数据:

脚本吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 16:42:15 | 显示全部楼层

不是,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 16:43:21 | 显示全部楼层    本楼为最佳答案   
看起来你的代码应该是正确的,但你可能忽略了一点,就是你在 if __name__ == '__main__': 后面多了一个括号。正确的写法应该是  if __name__ == '__main__': ,而不是  if __name__ == '__main__()': 。

这是因为, if __name__ == '__main__':  是Python中常用的用于判断当前脚本是否作为主程序运行的语句。 '__main__' 是当前模块的名字,当模块被直接运行时模块名为  '__main__' 。当你错误地写成  '__main__()' 时,Python就无法正确判断当前脚本是否为主程序,所以main()函数就没有被调用,导致了你的代码没有按预期运行。

你只需要删除这个括号,代码应该就可以正常运行了:
if __name__ == '__main__':
    main()

还有一点需要注意,你在调用 scrape_index(page) 后直接调用了 parse_index() ,这可能会在页面还没有完全加载的时候就开始解析,可能导致爬取失败。你可以试试将 parse_index() 放在 scrape_index(page) 的内部,在确认页面加载完毕后再开始解析。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 16:44:14 | 显示全部楼层

占楼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 16:46:24 | 显示全部楼层
根据你提供的代码,我注意到可能有以下问题导致浏览器一闪而过并没有爬取到任何数据:

1. ChromeDriver路径问题:你在初始化浏览器对象时指定了ChromeDriver的路径,但请确保该路径是正确的。验证方法是手动使用该路径启动ChromeDriver,确保能够成功启动浏览器。
2. 网络连接问题:请确保你的机器可以正常访问 `https://spa2.scrape.center` 网站。你可以尝试在浏览器中手动访问该网址,以确保网络连接没有问题。
3. CSS选择器问题:在 `scrape_index()` 函数中,你使用了一个 CSS 选择器来定位列表页中的元素。请确保该选择器是正确的,并且能够准确匹配到你想要的元素。你可以使用浏览器开发者工具来检查页面中的元素和对应的CSS选择器。
4. 程序逻辑问题:你的代码中有一个括号错误。在 `__name__ == '__main__'` 的条件判断中,括号应该是双下划线,而不是单下划线。修改该行为 `__name__ == '__main__'`。

你可以按照以上步骤检查并修复问题,如果还有其他问题,请提供更多的信息和错误日志,我们将尽力帮助你解决。另外,确保已经安装了正确版本的 Selenium 和 ChromeDriver。如果问题仍然存在,请提供详细的错误日志以便更好地理解问题。

根据你的代码和问题描述,我修改了你的代码并进行了优化。以下是修正后的代码:
import time
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from urllib.parse import urljoin
import logging

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s: %(message)s')
INDEX_URL = 'https://spa2.scrape.center/page/{}'
TIME_OUT = 10
PAGE = 10

# 初始化浏览器对象
path = '/path/to/chromedriver'  # 替换为你的ChromeDriver路径
options = webdriver.ChromeOptions()
options.add_argument('--headless')  # 设置无界面模式,可以加快运行速度
brower = webdriver.Chrome(executable_path=path, options=options)
wait = WebDriverWait(brower, TIME_OUT)

def scrape_page(url, condition, locator):
    logging.info('正在爬取:{}'.format(url))
    try:
        brower.get(url)
        wait.until(condition(locator))
        time.sleep(2)  # 等待页面加载完全
        return brower.page_source
    except TimeoutException:
        logging.error('页面加载超时:{}'.format(url), exc_info=True)
        return None

def scrape_index(page):
    url = INDEX_URL.format(page)
    return scrape_page(url, condition=EC.visibility_of_all_elements_located, locator=(By.CSS_SELECTOR, '#index .item'))

def parse_index(html):
    if html is None:
        return []
    elements = brower.find_elements(By.CSS_SELECTOR, '#index .item .name')
    urls = []
    for element in elements:
        href = element.get_attribute('href')
        url = urljoin(INDEX_URL, href)
        urls.append(url)
    return urls

def main():
    try:
        for page in range(1, PAGE+1):
            html = scrape_index(page)
            detail_urls = parse_index(html)
            logging.info('详情页地址:{}'.format(detail_urls))
    finally:
        brower.quit()

if __name__ == '__main__':
    main()

请确保替换代码中的 `/path/to/chromedriver` 为你本地的 ChromeDriver 路径。此外,为了加快运行速度,我添加了 `--headless` 参数,使浏览器在无界面模式下运行。

这里对代码进行了一些优化,例如在 `scrape_page` 函数中加入了延时等待以确保页面完全加载,以及在 `parse_index` 函数中返回解析得到的URL列表。

运行代码后,你将在日志中看到爬取的详情页地址。如果仍然无法爬取到数据,请提供详细的错误日志以便更好地帮助你调试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-30 16:48:03 | 显示全部楼层
isdkz 发表于 2023-6-30 16:43
看起来你的代码应该是正确的,但你可能忽略了一点,就是你在 if __name__ == '__main__': 后面多了一个括号 ...

好的,感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-30 16:48:47 | 显示全部楼层
sfqxx 发表于 2023-6-30 16:46
根据你提供的代码,我注意到可能有以下问题导致浏览器一闪而过并没有爬取到任何数据:

1. ChromeDriver ...

好的,感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-30 16:51:48 | 显示全部楼层


为啥不给我最佳答案

不过还好不是歌者
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-30 16:52:13 | 显示全部楼层
歌者文明清理员 发表于 2023-6-30 16:41
根据你提供的代码,可能是由于以下原因导致浏览器一闪而过,并没有爬取到任何数据:

好的,感谢感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 19:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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