python中selenium中使用ajax_python+pyquery+selenium 爬取ajax界面内容和加载问题

python爬虫遇到有翻页和ajax页面时用selenium操作更方便点,也有pyquery库解析页面资源,可以达到持续爬取界面的数据;

一 selenium操作浏览器

from selenium importwebdriverfrom selenium.webdriver.common.by importByfrom selenium.webdriver.support.wait importWebDriverWaitfrom selenium.webdriver.support importexpected_conditions

url= 'xxx'driver=webdriver.Chrome()

driver.get(url)

driver.find_element_by_xpath('xxx')

driver.find_element_by_xpath('xxx')

driver.find_element_by_xpath('xxx')

WebDriverWait(driver,20,0.5).until(expected_conditions(visibility_of_element_located((By.XPATH,'xxx'))))

driver.find_element_by_xpath('xxx')

这主要是实例化一个浏览器驱动,然后操作请求界面的操作,得到想要爬取的内容;其中selenium 环境安装有文章selenium+python 环境配置介绍,然后使用xpath定位对面后期整个爬虫代码健壮性有帮助,也有 selenium+pyton 的xpath应用文章介绍,这里就不重复说了,做好前期工作,开始解析界面资源了。

二 pyquery解析界面资源

from pyquery importPyQuery

html= driver.page_source #获取界面源

data = PyQuery(html) #解析界面资源,获取源码

items = data('.xxx').items() #通过pyquery的筛选查找规则获取自己想要爬取的标签

data_list = [] #用来存储目标数据的列表

for item initems: #遍历标签,提取想要的内容

dicts={'xxx':item.find('.xxx').eq(1).text'xxx':item.find('.xxx').eq(2).text'xxx':item.find('.xxx').eq(3).text

...

}

data_list.append(dicts)

pyquery库使用还有更多用法,推荐一篇博客 pyquery的使用;到这一步我们已经拿到想要的数据了,也整理好,下一步就是处理界面ajax问题了;

三 ajax加载问题处理

1.selenium的隐式等待,不推荐硬等待

a.WebDriverWait(driver,20,0.5).until(EC.element_to_be_clickable((By.XPATH,'xxx'))) #直到xx元素出现,隐式等待

b.WebDriverWait(driver,20,0.5).until_not(EC.element_to_be_clickable((By.XPATH,'xxx'))) #知道xx元素消失 隐式等待

2.js判断界面接口是否加载完成#document.readyState == “complete” ready是所有dom结构完成并不能检测到ajax数据请求的完成

js = 'function loadScript(url,callback) {

var script = document.createElement('script');

script.type= 'text/javascript';if(script.readyState){//IE

script.onreadystatechange=function () {if(script.readyState=='load'|| script.readyState == 'complete'){

script.onreadystatechange=null;

callback();

};

};

}else{ //其他浏览器

script.οnlοad=function () {

callback();

};

};

script.src=url;

document.getElementsByTagName('head')[0].appendChild(script);

};

driver.execute_script(js)3.python代码判断,亲测最稳健!!!#比如加载一个元素的属性加载前后是变化的,就可以通过这个元素来判断ajax是否加载完成

whileTrue:

button_class=self.driver.find_element_by_xpath('xxx').get_attribute('xxx')if 'next-btn-loading' not inbutton_class:break

另外附上判断界面元素是否存在和是否加载完毕

1

2 defis_element_exit(self, xpath):3 '''判断界面元素是否存在,存在返回True,反之返回False'''

4 #element必须为一个列表,所以要用加s

5 element =self.driver.find_elements_by_xpath(xpath)6 if len(element) !=0:7 returnTrue8 if len(element) ==0:9 returnFalse10

11

12 defis_load_complete(self,xpath):13 '''判断界面加载是否完成'''

14 whileTrue:15 element_statue =self.is_element_exit(xpath)16 time.sleep(0.2)17 if element_statue ==True:18 time.sleep(1)19 break

实际经验还是python判断比较稳定;selenium判断有时遇到元素一直都显示再dom树就不好判断了;js判断太复杂,需要一定js基础。

四 写入数据库

importpymysql

conn=pymysql.connect(server,user,pwd,database)

consor=conn.consor()for data indata_list:

sql= "insert into [数据库].[文件名].[表名](column1,column2,column3)".format(column1=data['xxx'],column2=data['xxx'],column3=data['xxx']...)

consor.execute(sql)

conn.commit()

conn.close()

至此,基本的关于ajax加载的界面数据已经提取完成~

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值