V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
bmos
V2EX  ›  Python

Python selenium chrome 使用代理做爬虫的问题,如何判断获取的页面正常

  •  
  •   bmos · 2018-08-24 09:33:10 +08:00 · 4921 次点击
    这是一个创建于 2302 天前的主题,其中的信息可能已经有所发展或是发生改变。
    RT,IP 代理不是 100%靠谱。经常会出现未连接到网络等错误。
    同一类型的网页可以通过判断某个元素是否加载完成判断。
    那么不同类型的网页如何判断呢?
    谢谢
    14 条回复    2018-08-30 16:14:57 +08:00
    princelai
        1
    princelai  
       2018-08-24 09:45:54 +08:00 via Android   ❤️ 1
    selenium 有个 EC,BY,用这两个关键词搜,有例子
    bobobo80
        2
    bobobo80  
       2018-08-24 09:49:36 +08:00   ❤️ 1
    selenium 应该是没有办法返回类似 requests 的 status_code 的,所以需要自己来判断一下返回页面中是否包含正常的元素,elem = driver.find_element_by_id("XXX")。需要试出一些验证码,429,404 等页面的状态,加入状态判断。
    bmos
        3
    bmos  
    OP
       2018-08-24 09:51:26 +08:00
    @princelai 这应该是显性等待某个元素出现,我希望抓不同来源的页面不一定有同样的元素。难道把 chrome 报错页面的元素全部枚举,判断下有没有出现,主要困惑是不知道报错页面总共有多少种类型。
    zeR0f1re
        4
    zeR0f1re  
       2018-08-24 09:54:48 +08:00   ❤️ 1
    @bmos 你说的报错页面难道不是返回的 http 状态码吗?我也在练习 selenium 相关的东西,希望能从你这贴了解一些问题,说错的地方多包涵
    zeR0f1re
        5
    zeR0f1re  
       2018-08-24 09:56:22 +08:00
    @bmos 刚想起来还有验证页面这样的,要是这种情况判断状态码也不行
    bmos
        6
    bmos  
    OP
       2018-08-24 10:05:08 +08:00
    @zeR0f1re :类似于这样:
    无法访问此网站
    www.google.com 的响应时间过长。
    请试试以下办法:

    检查网络连接
    检查代理服务器和防火墙
    运行 Windows 网络诊断
    ERR_CONNECTION_TIMED_OUT

    @bobobo80 谢谢。
    princelai
        7
    princelai  
       2018-08-24 10:30:53 +08:00
    @bmos 你不同页面的元素获取在一个函数内?每个页面分别用一个函数或方法才是合理的结构吧,然后每个函数分别判断某个元素是否加载。
    nature91
        8
    nature91  
       2018-08-24 10:35:01 +08:00   ❤️ 1
    用等待啊 超过时长响应就跳出去 至于后续怎么操作可以自己定义
    princelai
        9
    princelai  
       2018-08-24 10:35:12 +08:00
    ```
    browser = webdriver.Firefox(firefox_options=generate_option())
    browser.get(self.baseurl)
    locator = (By.CLASS_NAME, 'kr_article_list')
    try:
    WebDriverWait(browser, 15, 1).until(EC.presence_of_element_located(locator))
    except:
    logging.info('error:element of news list do not presence.')
    exit(1)
    ```

    给你个我自己的例子,我是只获取一个页面,所以判断一个元素是否出现就可以了,你可以建一个字典,key 是网址前缀,value 是元素名,然后用正则表达式匹配就可以实现多匹配了么
    bmos
        10
    bmos  
    OP
       2018-08-24 10:45:16 +08:00
    @princelai 我是把解析页面做了单独的线程,这里有单独函数判断页面元素是否存在。selenium 只负责打开页面,然后把页面源码保存到队列中。但是 IP 代理失效时,chrome 报错页面也是网页,这时候就把报错页面的源码保存下来了。我需要做的是检测 IP 代理失效的情况,这时候就更换代理。
    bmos
        11
    bmos  
    OP
       2018-08-24 10:54:13 +08:00
    @princelai 谢谢,字典是很好的思路。
    ClutchBear
        12
    ClutchBear  
       2018-08-24 11:17:59 +08:00
    我的方法是
    用 selenium 的 chrome 获取 cookies,然后 requests 用这个 cookies 来爬取页面.
    一个 cookies 可以用多次, 如果 ip 超时或者获取不到 html,
    就换一个 ip, 重新获取 cookies.
    bmos
        13
    bmos  
    OP
       2018-08-24 11:47:53 +08:00
    @ClutchBear 主要是有些页面元素动态加载的。才用 selenium 方便一点。
    sess222
        14
    sess222  
       2018-08-30 16:14:57 +08:00
    @ClutchBear 哎,用 SELENIUM 登登天猫国际感受下恶意吧哈哈,
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5217 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:42 · PVG 14:42 · LAX 22:42 · JFK 01:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.