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
'''
遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
'''
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')

####二 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)

####三 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

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

def is_element_exit(self, xpath):
    ''' 判断界面元素是否存在,存在返回True,反之返回False '''
    #element必须为一个列表,所以要用加s
    element = self.driver.find_elements_by_xpath(xpath)
    if len(element) != 0:
        return True
    if len(element) == 0:
            return False


def is_load_complete(self,xpath):
    ''' 判断界面加载是否完成 '''
    while True:
        element_statue = self.is_element_exit(xpath)
        time.sleep(0.2)
        if element_statue == True:
            time.sleep(1)
            break

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

####四 写入数据库

import pymysql
'''
遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!
'''
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()

本文转载:CSDN博客