上一篇里了解了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)