2019-11-14 seleniumm模块学习-续(模拟Ajax请求)

上一篇里了解了seleniumm基本用法,同时模拟操作了浦发营业网点查询。

之所以要用seleniumm来模拟,是因为浦发营业网点的信息是通过ajax动态加载的。我又不知道如何用python原生代码来操作ajax获取网页信息。

使用seleniumm缺点就是感觉获取网页数据的速度慢,特别是大数据量操作很明显。

点击营业网点查询按钮后的界面如下
在这里插入图片描述

此时网页中营业网点相关html代码结构如下
在这里插入图片描述

在tbody下有11个tr,第一个是表头,其他是10个网点。
每个网点tr中第一个td是收音机按钮,其余4个td是网点信息。
最终代码如下

wait.until(lambda driver: driver.find_element('class name','ltext')) #网点列表出现

b_name = driver.find_elements_by_xpath("//table[@class='table02']/tbody/tr/td[2]")
#print type(b_name) # <type 'list'>
#print len(b_name) #10
#print type(b_name[1]) #<class 'selenium.webdriver.firefox.webelement.FirefoxWebElement'>
b_add = driver.find_elements_by_xpath("//table[@class='table02']/tbody/tr/td[3]")
b_post = driver.find_elements_by_xpath("//table[@class='table02']/tbody/tr/td[4]")
b_tele = driver.find_elements_by_xpath("//table[@class='table02']/tbody/tr/td[5]")

results=pd.DataFrame()

for i in range(len(b_name)):
    result=pd.DataFrame([b_name[i].text,b_add[i].text,b_post[i].text,b_tele[i].text]).T
    results = results.append(result)
    
results.columns = ['营业网点名称','营业地址','邮编','联系电话']  
results.to_excel('Result.xlsx',encoding='gbk',index=False)

代码中最重要的就是find_elements_by_xpath,它是利用Xpath (XML Path Language)来选择元素节点,具体可以参见https://blog.csdn.net/u012941152/article/details/83011110中的介绍。

关于元素中值的获取

  • b_name[i].text,获取元素的值
  • b_name[i].get_attribute(‘style’),获取元素的属性值

表格输出方法可以参见 https://mp.csdn.net/postedit/102991431
表格内容如下
在这里插入图片描述再加一个循环就能获得所有营业网点,判断条件是看"下一页"链接是否有效。
观察下面的分页html代码
在这里插入图片描述

分页代码的逻辑就是,如果当前是最后一页,那么“下一页”链接标签的Class=“disable”。
如果不是组后一页,那么“下一页”链接标签的Class=“classPage”。
实现循环

elem_a=driver.find_elements_by_xpath("//div[@id='js_page2']/a")
while elem_a[len(elem_a) - 1].get_attribute('class')<>'disable': #下一页链接有效
    elem_a[len(elem_a) - 1].click() #点击进入下一页

    wait.until(lambda driver: driver.find_element('class name','ltext')) #网点列表出现

    b_name = driver.find_elements_by_xpath("//table[@class='table02']/tbody/tr/td[2]")
    b_add = driver.find_elements_by_xpath("//table[@class='table02']/tbody/tr/td[3]")
    b_post = driver.find_elements_by_xpath("//table[@class='table02']/tbody/tr/td[4]")
    b_tele = driver.find_elements_by_xpath("//table[@class='table02']/tbody/tr/td[5]")

    for i in range(len(b_name)):
        result=pd.DataFrame([b_name[i].text,b_add[i].text,b_post[i].text,b_tele[i].text]).T
        results = results.append(result)
        
    elem_a=driver.find_elements_by_xpath("//div[@id='js_page2']/a")

results.columns = ['营业网点名称','营业地址','邮编','联系电话']  
results.to_excel('Result.xlsx',encoding='gbk',index=False)

代码有点冗余,意思到了就行。

补充,如果不想看到界面,可以按照下面方式执行

from selenium.webdriver.firefox.options import Options

# 设置chrome为无界面浏览器
options = Options()
options.add_argument('--headless')
 
# 打开浏览器
browser = webdriver.Firefox(options=options)
发布了122 篇原创文章 · 获赞 7 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42555985/article/details/103067955