zoukankan      html  css  js  c++  java
  • python+pyquery+selenium 爬取ajax界面内容和加载问题

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

    一 selenium操作浏览器

      

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.support import expected_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 import PyQuery
    
    
    html = driver.page_source #获取界面源
    data = PyQuery(html) #解析界面资源,获取源码
    items = data('.xxx').items() #通过pyquery的筛选查找规则获取自己想要爬取的标签
    data_list = [] #用来存储目标数据的列表
    for item in items: #遍历标签,提取想要的内容
        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.onload = function () {
                    callback();
                };
            };
        script.src = url;
        document.getElementsByTagName('head')[0].appendChild(script);
        };
    driver.execute_script(js) 
    
    3.python代码判断,亲测最稳健!!!
    #比如加载一个元素的属性加载前后是变化的,就可以通过这个元素来判断ajax是否加载完成
     while True:
         button_class =self.driver.find_element_by_xpath('xxx').get_attribute('xxx')
         if 'next-btn-loading' not in button_class:
             break
    另外附上判断界面元素是否存在和是否加载完毕
     1 
     2 def is_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         return True
     8     if len(element) == 0:
     9             return False
    10 
    11 
    12 def is_load_complete(self,xpath):
    13     ''' 判断界面加载是否完成 '''
    14     while True:
    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基础。

         

    四 写入数据库

    import pymysql
    
    conn = pymysql.connect(server,user,pwd,database)
    consor = conn.consor()
    
    for data in data_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加载的界面数据已经提取完成~

  • 相关阅读:
    类继承
    抽象基类 纯虚函数
    虚函数
    Java网络通信
    Java补补补
    刷LeetCode吧
    贝叶斯网络的
    vscode添加vue模板
    vue--项目实例
    Java01
  • 原文地址:https://www.cnblogs.com/shiyuheng/p/9935327.html
Copyright © 2011-2022 走看看