1
princelai 2018-08-24 09:45:54 +08:00 via Android 1
selenium 有个 EC,BY,用这两个关键词搜,有例子
|
2
bobobo80 2018-08-24 09:49:36 +08:00 1
selenium 应该是没有办法返回类似 requests 的 status_code 的,所以需要自己来判断一下返回页面中是否包含正常的元素,elem = driver.find_element_by_id("XXX")。需要试出一些验证码,429,404 等页面的状态,加入状态判断。
|
3
bmos OP @princelai 这应该是显性等待某个元素出现,我希望抓不同来源的页面不一定有同样的元素。难道把 chrome 报错页面的元素全部枚举,判断下有没有出现,主要困惑是不知道报错页面总共有多少种类型。
|
4
zeR0f1re 2018-08-24 09:54:48 +08:00 1
@bmos 你说的报错页面难道不是返回的 http 状态码吗?我也在练习 selenium 相关的东西,希望能从你这贴了解一些问题,说错的地方多包涵
|
6
bmos OP @zeR0f1re :类似于这样:
无法访问此网站 www.google.com 的响应时间过长。 请试试以下办法: 检查网络连接 检查代理服务器和防火墙 运行 Windows 网络诊断 ERR_CONNECTION_TIMED_OUT @bobobo80 谢谢。 |
7
princelai 2018-08-24 10:30:53 +08:00
@bmos 你不同页面的元素获取在一个函数内?每个页面分别用一个函数或方法才是合理的结构吧,然后每个函数分别判断某个元素是否加载。
|
8
nature91 2018-08-24 10:35:01 +08:00 1
用等待啊 超过时长响应就跳出去 至于后续怎么操作可以自己定义
|
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 是元素名,然后用正则表达式匹配就可以实现多匹配了么 |
10
bmos OP @princelai 我是把解析页面做了单独的线程,这里有单独函数判断页面元素是否存在。selenium 只负责打开页面,然后把页面源码保存到队列中。但是 IP 代理失效时,chrome 报错页面也是网页,这时候就把报错页面的源码保存下来了。我需要做的是检测 IP 代理失效的情况,这时候就更换代理。
|
12
ClutchBear 2018-08-24 11:17:59 +08:00
我的方法是
用 selenium 的 chrome 获取 cookies,然后 requests 用这个 cookies 来爬取页面. 一个 cookies 可以用多次, 如果 ip 超时或者获取不到 html, 就换一个 ip, 重新获取 cookies. |
13
bmos OP @ClutchBear 主要是有些页面元素动态加载的。才用 selenium 方便一点。
|
14
sess222 2018-08-30 16:14:57 +08:00
@ClutchBear 哎,用 SELENIUM 登登天猫国际感受下恶意吧哈哈,
|