文章目录
Ajax/selenium爬虫
一、为什么用Ajax
1. 浏览器中可看到正常显示的数据,但使用requests得到的结果并没有。 这是什么原因呢?
requests获取的是原始的HTML文档,而浏览器中的页面是经过JS处理数据后生成的结果。
也就是说原始的html中没有数据,经过js加载后产生了数据。
右图的加载页面就是Ajax正在请求某一个API接口的数据,当请求到之后会返回给我们并展示出来。
2. 这些数据的来源有哪些情况呢?
Ajax加载、包含在HTML文档中、经过JavaScript和特定算法计算后生成
二、什么是Ajax
Ajax(Asynchronous JavaScript and XML)异步的JS和XML。原理是: 利用JS在保证页面不被刷新、页面链接不改变的情况下与服务器交换数据并更新部分网页的技术。
ajax通过原生的XMLHttpRequest对象发出HTTP请求,得到服务器返回的数据后,再进行处理
三、Ajax怎么分析页面
拖动刷新的内容由Ajax加载且页面的URL无变化,那么应该到哪里去查看这些Ajax请求呢?
-
开发者工具(F12)->Network选项卡, 获取页面加载过程中Browser与Server之间请求和响应。
-
筛选出所有的Ajax请求。在请求的上方有一层筛选栏,直接点击XHR(Ajax特殊的响应类型)
-
模拟Ajax请求,提取我们所需要的信息。
四、基于Ajax和requests采集器的微博爬虫
import os
import requests
from colorama import Fore
from fake_useragent import UserAgent
from requests import HTTPError
def download_page(url, parmas=None):
"""
根据url地址下载html页面
:param url:
:param parmas:
:return: str
"""
try:
ua = UserAgent()
headers = {
'User-Agent': ua.random,
}
# 请求https协议的时候, 回遇到报错: SSLError
# verify=Flase不验证证书
response = requests.get(url, params=parmas, headers=headers)
except HTTPError as e:
print(Fore.RED + '[-] 爬取网站%s失败: %s' % (url, str(e)))
return None
else:
# content返回的是bytes类型, text返回字符串类型
# response.json()方法会自动将字符串反序列为python数据类型
"""
html = response.text # 字符串
json.loads(html) # 将字符串反序列化为python数据类型
"""
# return response.json()
return response
def parse_html(html):
"""
参考源代码解析
:param html:
:return:
"""
cards = html.get('data').get('cards')
count = 0
for card in cards:
try:
count +=