Selenium

一。异常

1.selenium.common.exceptions.StaleElementReferenceException: Message: The element reference of <div class="deal-cnt"> is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed

解决方法:

time.sleep(3)

需要等待页面更新即可

2.ElementNotVisibleException

显示等待
wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-itemlist .items .item')))

WebDriverWait,配合该类的until()和until_not()方法进行的等待。它主要的意思就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
调用方法如下:
WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)

until()方法参数:
method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False
message: 如果超时,抛出TimeoutException,将message传入异常

until 中参数method ,用expected_conditions类中的方法:
presence_of_element_located 判断某个元素是否被加到了dom树里
element_to_be_clickable 判断某个元素中是否可见并且是enable的,这样的话才叫clickable
text_to_be_present_in_element 判断某个元素中的text是否包含了预期的字符串
presence_of_all_elements_located: 判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是'column-md-3',那么只要有1个元素存在,这个方法就返回True

 1 from selenium import webdriver
 2 from selenium.webdriver.common.by import By
 3 from selenium.webdriver.support.ui import WebDriverWait
 4 from selenium.webdriver.support import expected_conditions as EC
 5 from selenium.common.exceptions import TimeoutException
 6 import re
 7 browser=webdriver.Chrome()  #创建webdriver对象
 8 wait=WebDriverWait(browser, 10)
 9 def search():
10     try:
11         browser.get('https://www.taobao.com')#打开请求的url
12         input = wait.until(
13             EC.presence_of_element_located((By.CSS_SELECTOR,'#q')))#等待搜索输入框加载完成
14         input.send_keys("美食")#输入框中输入“美食”
15         sumbit=wait.until(
16             EC.element_to_be_clickable((By.CSS_SELECTOR,'#J_TSearchForm > div.search-button > button')))
17         sumbit.click()
18         total=wait.until(
19             EC.presence_of_element_located((By.CSS_SELECTOR,'#mainsrp-pager > div > div > div > div.total')))
20         return total.text
21     except TimeoutException:
22         return search
23 
24 def main():
25     total=search()
26     total=int(re.compile('(\d+)').search(total).group(1))
27     print (total)
28 if __name__=='__main__':
29     main()
30 
31   输出结果: 
32   100

 4.selenium.common.exceptions.UnexpectedAlertPresentException: Alert Text: None
Message: Dismissed user prompt dialog: 您的浏览器限制了第三方Cookie,这将影响您正常登录,您可以更改浏览器的隐私设置,解除限制后重试。

 

submit.send_keys(Keys.ENTER)#模拟回车
start_page_num = int(input('请输要 爬取 的起始1-100):')):注意输入要转成int
切记抓取过程每页要暂停 4 秒,抓取的上限是 100 页。
 BeautifulSoap
 pyquery
posted @ 2020-06-05 17:03  凤鸣朝阳水龙吟  阅读(650)  评论(0)    收藏  举报