爬虫1.5-ajax数据爬取

目录

  • 爬虫-ajax数据爬取

    • 1. ajax数据
    • 2. selenium+chromedriver知识准备
    • 3. selenium+chromedriver实战拉勾网爬虫代码

爬虫-ajax数据爬取

1. ajax数据

ajax (异步JavaScript 和 XML)(读作阿贾克斯),ajax可以时网页实现异步更新,一般使用的json数据交互,即在不重新加载整个页面也可以对网页的部分进行更新,ajax技术加载的数据在网页源代码中是看不到的,只能看到url加载的html部分

获取ajax数据的两种方式

1 分析ajax调用的接口,发现url的参数,再通过代码请求这个接口,直接拿到json数据,有时json数据可能是加密的,或者发送post请求获取json数据并且表单中的数据是按照一定规则写的,这时需要分析js代码,就很麻烦了。

2 Selenium+chromedriver 获取动态数据,Selenium 相当于可以模拟输入、删除和点击操作以及cookie chromedriver是一个驱动chrome浏览器的驱动程序,使用它可以驱动浏览器。这种方式可以直接获取网页中全部的代码,包括ajax技术加载的数据。例如有的网站点击“更多”按钮后可以加载的数据,将全部被获取。虽然这种方式简单粗暴,但每次请求页面时都会打开一个页面,加载数据和渲染页面,显得过于笨重。

2. selenium+chromedriver知识准备

chromedriver是谷歌浏览器的驱动程序,使用selenium可以操作它

chromedriver.exe需要放在一个非中文目录下

2.1 selenium+chromedriver简单操作

form selenium import webdriver
driver_path = r‘D:\chromedriver\chromedriver.exe‘  # 指明路径
driver = webdriver.Chrome(executable_path=driver_path)  # 创建driver实例,将路径传入
driver.get("https://www.baidu.com")  # get方式打开百度,注意一定要加https:// 否则会报错
driver.page_source # 获取源代码,然后可以扔给正则表达式或者xpath解析,这里可以直接获取ajax数据
driver.close() #关闭一个页面
driver.quit() #关闭整个浏览器

2.2 常用表单元素

input type=‘text/password/email/number‘ 文本框

button input [type=‘submit‘] 按钮 例如登陆

checkbox input type=‘checkbox‘ 例如记住密码选项

select 下拉菜单

2.3 模拟点击

driver.get(‘https://www.douban.com/‘)
remenberBtn = driver.find_element_by_id(‘form_remember‘)
remenberBtn.click()

2.4 行为链

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains  #导入driver和行为链类
driver_path = r‘D:\chromedriver\chromedriver.exe‘   #指定路径
driver = webdriver.Chrome(executable_path=driver_path)  #创建对象
driver.get(‘https://www.qq.com/‘)   #打开网页
moveTag = driver.find_element_by_xpath("//div[@class=‘more-txt‘]") #定位腾讯网中“更多”按钮
clickTag = driver.find_element_by_xpath("//ul[@class=‘sub-list cf‘]/li[1]")
#定位“独家”按钮
actions =ActionChains(driver)   # 创建行为链对象
actions.move_to_element(moveTag)   # 移动到定位点
actions.click(moveTag)  # 点击   好像不点击也可以
actions.move_to_element(clickTag)  # 移动到”独家“按钮
actions.click(clickTag) # 点击
actions.perform()  # 必须调用的函数   否则不会执行之前定义好的行为

# drver.find_element_by_xpath("") 意味着可以使用xpath语法找到想要点击的按钮或输入框
# 类似的还有id  class  css

2.5 页面等待

1 隐式等待
driver.implicitly_wait(x)  # x是等待时间   x秒
2 显示等待
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver_path = r‘D:\chromedriver\chromedriver.exe‘
driver = webdriver.Chrome(executable_path=driver_path)
driver.get(‘https://new.qq.com/ch/ori/‘)
try:
    WebDriverWait(driver, 10).until(
        # 这里使用WebDriverWait类填入参数   10代表等待10s未出现则抛出异常
    EC.presence_of_element_located((By.CLASS_NAME, ‘s ‘))
        #这里就是等待条件 即当class属性=s 被加载后条件达成
)
finally:
    print("2222")   # 这样的话当没有等待到期望的条件就可以做其他事情

2.6 窗口

打开多个窗口
driver.get(‘https://new.qq.com/ch/ori/‘)
driver.execute_script("window.open(‘https://www.douban.com/‘)")
#使用JavaScript脚本打开新页面
driver.get(‘https://new.qq.com/ch/ori/‘)
driver.execute_script("window.open(‘https://www.douban.com/‘)")   # 打开两个页面
print(driver.current_url)   # 打印当前url
driver.switch_to.window(driver.window_handles[1]) #  切换窗口   窗口列表中第二个窗口的索引是1
print(driver.current_url)  # 打印当前url

2.7 代理ip

driver_path = r‘D:\chromedriver\chromedriver.exe‘
options = webdriver.ChromeOptions()  # 创建配置对象
options.add_argument("--proxy-server=http://221.6.32.206:41816")  # 写入配置
driver = webdriver.Chrome(executable_path=driver_path, options=options)  # 写入参数
driver.get(‘https://www.baidu.com/s?wd=ip‘)

3. selenium+chromedriver实战拉勾网爬虫代码

# 拉勾网的反爬太恶心了,于是用selenium+chromedriver来爬,结果还是被封了,我去

import re
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from lxml import etree

class LagouSpider(object):
    def __init__(self):
        driver_path = r‘D:\chromedriver\chromedriver.exe‘  # 指定chromedriver 的路径
        self.driver = webdriver.Chrome(executable_path=driver_path)
        self.base_url = ‘https://www.lagou.com/jobs/list_python?px=default&city=%E6%88%90%E9%83%BD#filterBox‘   # 拉勾网搜索python的页面url
        self.data = []  # 用来存放字典

    def get_url_list(self):
        while True:
            self.driver.get(self.base_url)  # 访问拉勾网
            # 获取页面全部文本信息,这里可以直接获取ajax技术返回的数据,
            # 如果用requests库需要找到发送json请求的数据包
            text = self.driver.page_source
            try:
                # 等待职位信息的url出现,timeout=3s
                WebDriverWait(self.driver, 3).until(
                    EC.presence_of_element_located((By.CLASS_NAME, ‘position_link‘))
                )
                # 获取url并调用get_info函数
                url_list = re.findall(r‘<a class="position_link" href="(.*?)" target=.*?>‘, text, re.S)
                for i in url_list:
                    self.get_info(i)
            finally:
                # 判断是否已到最后一页
                if len(re.findall(r‘class="pager_next pager_next_disabled"‘, text, re.S)) != 0:
                    self.driver.quit()
                    break
                # 找到下一页的位置并点击
                else:
                    nextPageTag = self.driver.find_element_by_xpath("//div[@class=‘pager_container‘]/span[last()]")
                    nextPageTag.click()

    def get_info(self, url):
        # 打开新窗口,移动driver,不移动无法获取page_source
        self.driver.execute_script("window.open(‘{}‘)".format(url))
        self.driver.switch_to.window(self.driver.window_handles[1])
        try:
            # 提取信息,因为职位描述信息的标签实在是太乱了,还是用xpath舒服一点
            html = etree.HTML(self.driver.page_source)
            work_name = re.findall(r‘<div class="job-name" title="(.*?)">‘, self.driver.page_source, re.S)[0]
            salary = re.findall(r‘<span class="salary">(.*?)</span>‘, self.driver.page_source, re.S)[0]
            # 获取职位描述信息
            temp = html.xpath("//dd[@class=‘job_bt‘]//div/p/text()")
            describe = ‘‘
            for i in temp:
                describe += i
            describe = re.subn(r‘\s*‘, ‘‘, describe)
            temp = {
                ‘job_name‘: work_name,
                ‘describe‘: describe[0],
                ‘salary‘: salary
            }
            print(temp)
            # 放入列表中,方便写入csv或者txt
            self.data.append(temp)
        except:
            # 出错的页面打印出来
            print(url)
            time.sleep(5)
        finally:
            # 关闭页面,移动driver到最开始的base_url
            self.driver.close()
            self.driver.switch_to.window(self.driver.window_handles[0])
            time.sleep(1)

    def run(self):
        self.get_url_list()

if __name__ == ‘__main__‘:
    spider = LagouSpider()
    spider.run()

原文地址:https://www.cnblogs.com/bitterzZ/p/10195107.html

时间: 2024-11-08 10:38:15

爬虫1.5-ajax数据爬取的相关文章

爬虫(十):AJAX、爬取AJAX数据

1. AJAX 1.1 什么是AJAX AJAX即“Asynchronous JavaScript And XML”(异步JavaScript和XML)可以使网页实现异步更新,就是不重新加载整个网页的情况下,对网页的某部分进行更新(局部刷新).传统的网页(不使用AJAX)如果需要更新内容,必须重载整个网页页面. AJAX = 异步JavaScript和XML,是一种新的思想,整合之前的多种技术,用于创建快速交互式网页应用的页面开发技术. 1.2 同步和异步 同步现象:客户端发送请求到服务器端,当

Ajax数据爬取

Ajax数据爬取 简介 数据加载是异步加载,局部刷新.web开发的前后端分离通常都用Ajax交互,降低了服务器直接渲染页面带来的压力 基本原理 发送请求 解析内容 渲染网页 其实就是 向后端指定接口发送请求,返回数据,渲染页面 JS对Ajax底层的实现,实际上是新建了一个XMLHttpRequest对象 Ajax分析方法 发送的请求类型为 XHR :Request Headers 中就有一条信息为 X-Request-With:XMLHttpRequest ,这就标记了该请求为Ajax请求:返回

《python3网络爬虫开发实战》--Ajax数据爬取

1. ajax 异步的 JavaScript和 XML. 对于传统的网页,如果想更新其内容,那么必须要刷新整个页面,但有了 Ajax,便可以在页面不被全部刷新的情况下更新其内容. 在这个过程中,页面实际上是在后台与服务器进行了数据交互,获 取到数据之后,再利用 JavaScript改变网页,这样网页内容就会更新了. 2. Ajax请求网页更新: 发送请求 解析内容 渲染网页 3. Ajax分析方法: 查看请求 过滤请求 4. Ajax结果提取: 分析请求 分析响应 原文地址:https://ww

前端反爬虫策略--font-face 猫眼数据爬取

1 .font-face定义了字符集,通过unicode去印射展示. 2 .font-face加载网络字体,我么可以自己创建一套字体,然后自定义一套字符映射关系表例如设置0xefab是映射字符1,0xeba2是映射字符2,以此类推.当需要显示字符1时,网页的源码只会是0xefab,被采集的也只会是 0xefab,并不是1 3 .但是对于正常的用户来说则没有影响,因为浏览器会加载css的font字体为我们渲染好,实时显示在网页中. 4 .所以我们需要做的是,如何在判断请求web字体的是机器人或者是

python爬虫实例详细介绍之爬取大众点评的数据

python 爬虫实例详细介绍之爬取大众点评的数据 一. Python作为一种语法简洁.面向对象的解释性语言,其便捷性.容易上手性受到众多程序员的青睐,基于python的包也越来越多,使得python能够帮助我们实现越来越多的功能.本文主要介绍如何利用python进行网站数据的抓取工作.我看到过利用c++和Java进行爬虫的代码,c++的代码很复杂,而且可读性.可理解性较低,不易上手,一般是那些高手用来写着玩加深对c++的理解的,这条路目前对我们不通.Java的可读性还可以,就是代码冗余比较多,

Python爬虫 股票数据爬取

前一篇提到了与股票数据相关的可能几种数据情况,本篇接着上篇,介绍一下多个网页的数据爬取.目标抓取平安银行(000001)从1989年~2017年的全部财务数据. 数据源分析 地址分析 http://money.finance.sina.com.cn/corp/go.php/vFD_FinancialGuideLine/stockid/000001/ctrl/2017/displaytype/4.phtml 在浏览器(PC上)中打开这个地址,就可以看到下图显示的财务数据.这个地址是一个通用格式:(

Python爬虫入门教程 3-100 美空网数据爬取

简介 从今天开始,我们尝试用2篇博客的内容量,搞定一个网站叫做"美空网"网址为:http://www.moko.cc/, 这个网站我分析了一下,我们要爬取的图片在 下面这个网址 http://www.moko.cc/post/1302075.html 然后在去分析一下,我需要找到一个图片列表页面是最好的,作为一个勤劳的爬虫coder,我找到了这个页面 http://www.moko.cc/post/da39db43246047c79dcaef44c201492d/list.html 列

爬虫案例—中基协数据爬取

因为工作原因,需要爬取相关网站的数据,包括中基协网站和天眼查部分数据. 一.中基协网站 爬取思路: 1.查看目标页:http://gs.amac.org.cn/amac-infodisc/api/pof/manager?rand=0.9775162173180119&page=%s&size=50 发现有随机数字串(刷新反爬措施),以及页码和每页信息条数,可以用来拼接爬取url 用一个循环爬取所有展示页面,用到requests库以及random函数生成随机数 返回的是json数据,直接用r

爬虫练习五:多进程爬取股市通股票数据

在上网查阅一些python爬虫文章时,看见有人分享了爬取股票的交易数据,不过实现得比较简单.这里就做个小练习,从百度股票批量爬取各股票的交易信息. 文章出处为:Python 爬虫实战(2):股票数据定向爬虫. 爬取数据:每个股票的日度交易数据 爬取来源:百度股市通 python版本:3.6.6 时间:20190115 1. 找到日度数据url 以中化国际的日K数据为例,通过分析网页,我们可以发现,日度交易数据是通过接口的形式获取的. 获取的url为:https://gupiao.baidu.co