目前很多网站都使用ajax技术动态加载数据,和常规的网站不一样,数据时动态加载的,如果我们使用常规的方法爬取网页,得到的只是一堆html代码,没有任何的数据。

Ajax是利用 JavaScript在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。

Ajax基本原理

  1. 发送请求

  2. 解析内容

  3. 渲染页面

比如:

首先打开chrome浏览器,打开开发者工具,点击Network选项,点击XHR选项,然后输入网址:https://www.baidu.com/,点击Preview选项卡,就会看到通过ajax请求返回的数据,Name那一栏就是ajax请求,当鼠标向下滑动时,就会出现多条ajax请求:

通过上图我们知道ajax请求返回的是json数据。

爬取AJAX有两种方式:

1.直接分析AJAX调用的接口。然后通过代码请求这个接口。

2.使用selenium+浏览器驱动模拟浏览器行为获取数据。

分析接口:

优点:直接可以请求到数据。不需要做一些解析工作。代码量少,性能高。

缺点:分析接口比较负责,特别是一些通过JS混淆的接口,要有一定的JS功底。容易被发现是爬虫。

selenium:

优点:直接模拟浏览器的行为。浏览器能请求到的,使用selenium也能请求到。爬虫更稳定。

缺点:代码量多。性能低。

AJAX调用接口

使用内建的模块urlilib。比如下面的使用urllib演示一个post请求代码


from urllib.request import urlopen
from urllib.request import Request
from urllib import parsereq = Request('http://www.thsrc.com.tw/tw/TimeTable/SearchResult')
postData = parse.urlencode([("StartStation", "977abb69-413a-4ccf-a109-0272c24fd490"),("EndStation", "2f940836-cedc-41ef-8e28-c2336ac8fe68"),("SearchDate", "2018/01/06"),("SearchTime", "10:30"),("SearchWay", "DepartureInMandarin")
])
# header给的是来源和使用的请求工具浏览器
req.add_header("Origin", "http://www.thsrc.com.tw")
req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36")resp = urlopen(req, data=postData.encode("utf-8"))
print(resp.read().decode("utf-8"))

使用requests演示一个

import requests
parms = {"StartStation": "977abb69-413a-4ccf-a109-0272c24fd490","EndStation": "2f940836-cedc-41ef-8e28-c2336ac8fe68" ,"SearchDate": "2018/01/06" ,"SearchTime": "10:30" ,"SearchWay": "DepartureInMandarin"}# requests.post(url, data=data, headers=headers)
r = requests.post('http://www.thsrc.com.tw/tw/TimeTable/SearchResult', headers={'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit',  'Origin': 'http://www.thsrc.com.tw', },json=parms)print(r.text)

要记得把header和请求的数据写完整。

selenium

requests和selenium的不同:
        requests是通过模拟http请求来实现浏览网页的
        selenuim是通过浏览器的API实现控制浏览器,从而达到浏览器自动化

首先配置chromedriver。下载chromedriver之前需要先检查下chrome浏览器的版本,点击浏览器帮助--->关于 google chrome,检查浏览器的版本。笔者的浏览器是75.0.3770.100版本的。

我们需要根据浏览器的版本下载相应的chromedriver版本,需要查看一下chrome浏览器版本和chromedriver版本的对照表。

------------2019年兼容版本对照表-----------

注:支持chromeV74版本的driver版本号比较特别一点,不知道之后会不会回归以前正常的版本

ChromeDriver 76.0.3809.12 (2019-06-07)---------Supports Chrome version 76
ChromeDriver 75.0.3770.8 (2019-04-29)---------Supports Chrome version 75
ChromeDriver v74.0.3729.6 (2019-03-14)--------Supports Chrome v74
ChromeDriver v2.46 (2019-02-01)----------Supports Chrome v71-73
--------以下为2018年兼容版本对照表-------

ChromeDriver v2.45 (2018-12-10)----------Supports Chrome v70-72
ChromeDriver v2.44 (2018-11-19)----------Supports Chrome v69-71
ChromeDriver v2.43 (2018-10-16)----------Supports Chrome v69-71
ChromeDriver v2.42 (2018-09-13)----------Supports Chrome v68-70
ChromeDriver v2.41 (2018-07-27)----------Supports Chrome v67-69
ChromeDriver v2.40 (2018-06-07)----------Supports Chrome v66-68
ChromeDriver v2.39 (2018-05-30)----------Supports Chrome v66-68
ChromeDriver v2.38 (2018-04-17)----------Supports Chrome v65-67
ChromeDriver v2.37 (2018-03-16)----------Supports Chrome v64-66
ChromeDriver v2.36 (2018-03-02)----------Supports Chrome v63-65
ChromeDriver v2.35 (2018-01-10)----------Supports Chrome v62-64

从对照表可以看出, 版本为ChromeDriver 75.0.3770.8支持Chrome version 75。笔者的浏览器(75.0.3770.100)是属于version 75,所以对应下载ChromeDriver 75.0.3770.8。

下载网址:http://npm.taobao.org/mirrors/chromedriver/

把下载好的chromedriver.exe放置在相应位置,修改代码中的路径即可

#-*- coding:utf-8 -*-
import timefrom bs4 import BeautifulSoup
from selenium import webdriveropt = webdriver.ChromeOptions()          # 创建chrome对象
opt.add_argument('--no-sandbox')          # 启用非沙盒模式,linux必填,否则会报错:(unknown error: DevToolsActivePort file doesn't exist)......
opt.add_argument('--disable-gpu')          # 禁用gpu,linux部署需填,防止未知bug
opt.add_argument('headless')          # 把chrome设置成wujie面模式,不论windows还是linux都可以,自动适配对应参数
driver = webdriver.Chrome(executable_path=r'/root/chromedriver',options=opt)    # 指定chrome驱动程序位置和chrome选项
driver.get('https://baidu.com')          # 访问网页
time.sleep(5)           # 等待5秒
content = driver.page_source          # 获取5秒后的页面
soup = BeautifulSoup(content,features='html.parser')    # 将获取到的内容转换成BeautifulSoup对象
driver.close()print(soup.body.get_text())          # 通过BeautifulSoup对象访问获取到的页面内容

参考:

https://blog.csdn.net/well2049/article/details/78988189

https://blog.csdn.net/modabao/article/details/95017418

https://www.cnblogs.com/liuhui0308/p/12077963.html

https://www.cnblogs.com/liyihua/p/11182862.html

https://blog.51cto.com/xsboke/2352856

https://www.cnblogs.com/wzjbg/p/11192082.html

python3爬取网页AJAX数据相关推荐

  1. python3爬取网页数据学习笔记——XPath篇

    数据来源网站:2016中国企业500强排行榜(完整名单)→买购网 (maigoo.com) 参考资料:python3 爬取网页表格例子_快乐糖果屋的博客-CSDN博客 右键数据部分,选择检查 观察到需 ...

  2. python爬虫表格table_Python基于pandas爬取网页表格数据

    以网页表格为例:https://www.kuaidaili.com/free/ 该网站数据存在table标签,直接用requests,需要结合bs4解析正则/xpath/lxml等,没有几行代码是搞不 ...

  3. python 爬虫 表格,python爬虫爬取网页表格数据

    用python爬取网页表格数据,供大家参考,具体内容如下 from bs4 import BeautifulSoup import requests import csv import bs4 #检查 ...

  4. python爬取网页代码-python爬虫爬取网页所有数据详细教程

    Python爬虫可通过查找一个或多个域的所有 URL 从 Web 收集数据.Python 有几个流行的网络爬虫库和框架.大家熟知的就是python爬取网页数据,对于没有编程技术的普通人来说,怎么才能快 ...

  5. python pd.read_html 快速爬取网页表格数据与常规请求解析方式对比

    为爬取网页表格数据,较容想到的常规方式是通过requests请求以及lxml解析定位获取元素,此外还可以通过pandas库的read_html直接获取表格数据,得到的将是目标网页所有table表格的l ...

  6. python爬取网页json数据_python爬取json数据库

    手把手教你使用Python抓取QQ音乐数据(第一弹) [一.项目目标] 获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 由浅入深,层层递进,非常适合刚入门的同学练手. [二. ...

  7. python爬取网页公开数据_如何用Python爬取网页数据

    使用Python爬取网页数据的方法: 一.利用webbrowser.open()打开一个网站:>>> import webbrowser >>> webbrowse ...

  8. 使用python3爬取网页,利用aria2下载电影,Jellyfin自动更新最新电影

    前言:在我搭建好Jellyfin软件后,因为只能播放本地视频,就想能不能播放网络上的电影,可以每天自动下载并更新,这样就不用我手工下载好,再上传到NAS中播放.或许有更好的方法,那就是直接用电影播放源 ...

  9. 用python3爬取微博的数据和图片

    如何用python爬取微博的数据 这又是我正在学习崔庆才大佬的爬虫文章学习和体会到的啦,,, 正文 当我们浏览微博时,会发现微博网页下面都有下拉下载更多的选项,初始的页面只有几个微博的内容,当我们到最 ...

最新文章

  1. python数据分析面试_python数据分析面试
  2. 今晚8点开播 | 微信高级研究员解析深度学习在NLP中的发展和应用
  3. GitHub Port 443 Refused
  4. 1.1.2 以Web Host方式寄宿Web API
  5. ROS学习总结一ROS组织框架与几个关键词
  6. 在Web中如何运用JavaScript实现打印功能
  7. 面试中常问的HTTP/1.0状态码
  8. Selenium 中文手册
  9. java网络编程1、2章习题
  10. spark-shell 基本用法
  11. 端口映射--PortTunnel
  12. python贪吃蛇手机版代码_200行python代码实现贪吃蛇游戏
  13. 11个值得掌握的Java代码性能优化技巧
  14. 批量翻译软件免费【2022最新版】
  15. html5 歌词自动滚动效果,简单的HTML5音乐播放器(带歌词滚动)
  16. scratch小游戏2048
  17. Excel 技术篇-使用excel启用宏提示:“可能是因为该宏在此工作簿中不可用,或者所有的宏都被禁用“问题解决方法
  18. Visual studio code 使用 Team Foundation Server - Windows
  19. Python生信练习——hg38每条染色体基因,转录本的分布
  20. uni-app视图容器之movable-view

热门文章

  1. Mac pro微信开发者工具无法显示登录的二维码解决方案
  2. 西门子840Dsl系统的刀具列表数据采集
  3. nmn成分是什么,吃nmn对身体有哪些好处,掌握知识点
  4. 旧u盘丢失文件如何恢复
  5. How to set up the esp-hosted SDK compilation environment for ESP32-C3
  6. Python绘制三维立体图详解与绘图填充
  7. python3报错 TypeError: can’t concat bytes to str 原因与解决方法
  8. 【时间序列】时间序列曲线平滑+预测(LSTM)
  9. mmdetection3d的安装和使用
  10. EDSAC计算机之父——Maurice Wilkes