Python爬虫AJAX数据爬取和HTTPS访问详细步骤

Python爬虫AJAX数据爬取和HTTPS访问详细步骤

发布时间:2024-10-10 23:42:09

我会为您详细介绍如何使用python爬虫处理ajax数据爬取和https访问。这两个主题在现代网络爬虫中非常重要,因为许多网站使用ajax动态加载内容,而https则是当前网络安全的标准。让我们逐步深入探讨这两个主题。

  1. ajax数据爬取

ajax(asynchronous javascript and xml)允许网页在不刷新整个页面的情况下更新部分内容。爬取ajax加载的数据通常有两种方法:直接请求api或使用浏览器自动化工具。

1.1 直接请求api

步骤: a) 使用浏览器开发者工具分析网络请求 b) 找到ajax请求的url、参数和头信息 c) 使用python发送相同的请求

示例代码:

python

import requests
import json

def fetch_ajax_data(url, params, headers):
response = requests.get(url, params=params, headers=headers)
return response.json()

# 示例使用
url = 'https://api.example.com/data'
params = {
'page': 1,
'limit': 10
}
headers = {
'user-agent': 'mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/91.0.4472.124 safari/537.36',
'referer': 'https://www.example.com',
'x-requested-with': 'xmlhttprequest'
}

data = fetch_ajax_data(url, params, headers)
print(json.dumps(data, indent=2))

1.2 使用selenium模拟浏览器行为

当api难以直接访问时,可以使用selenium来模拟真实的浏览器行为。

python

from selenium import webdriver
from selenium.webdriver.chrome.options import options
from selenium.webdriver.common.by import by
from selenium.webdriver.support.ui import webdriverwait
from selenium.webdriver.support import expected_conditions as ec
import json

def fetch_ajax_data_with_selenium(url):
chrome_options = options()
chrome_options.add_argument("--headless")

driver = webdriver.chrome(options=chrome_options)
driver.get(url)

# 等待特定元素加载完成
element = webdriverwait(driver, 10).until(
ec.presence_of_element_located((by.class_name, "data-container"))
)

# 提取数据
data = driver.execute_script("return window.ajaxdata;") # 假设数据存储在全局变量中

driver.quit()
return data

# 使用示例
url = 'https://www.example.com/ajax-page'
data = fetch_ajax_data_with_selenium(url)
print(json.dumps(data, indent=2))

  1. https访问

https(http secure)是http的安全版本,使用ssl/tls进行加密。python的requests库默认支持https,但有时可能需要额外配置。

2.1 基本https请求

python

import requests

def fetch_https_data(url):
response = requests.get(url)
response.raise_for_status() # 如果请求不成功则抛出异常
return response.text

# 使用示例
url = 'https://api.github.com'
data = fetch_https_data(url)
print(data)

2.2 处理ssl证书验证

有时可能遇到ssl证书验证问题,特别是对于自签名证书。

python

import requests
import certifi

def fetch_https_data_with_cert(url):
response = requests.get(url, verify=certifi.where())
response.raise_for_status()
return response.text

# 使用示例
url = 'https://self-signed.badssl.com/'
try:
data = fetch_https_data_with_cert(url)
print(data)
except requests.exceptions.sslerror as e:
print(f"ssl证书验证失败: {e}")

2.3 客户端证书认证

某些https服务可能需要客户端证书认证。

python

import requests

def fetch_https_data_with_client_cert(url, cert_path):
response = requests.get(url, cert=cert_path)
response.raise_for_status()
return response.text

# 使用示例
url = 'https://client.badssl.com/'
cert_path = ('path/to/client.crt', 'path/to/client.key')
try:
data = fetch_https_data_with_client_cert(url, cert_path)
print(data)
except requests.exceptions.requestexception as e:
print(f"请求失败: {e}")

  1. 综合实例:爬取使用ajax和https的网站

让我们创建一个更复杂的爬虫,它能处理ajax加载的内容和https连接:

python

import requests
import json
from selenium import webdriver
from selenium.webdriver.chrome.options import options
from selenium.webdriver.common.by import by
from selenium.webdriver.support.ui import webdriverwait
from selenium.webdriver.support import expected_conditions as ec

class advancedscraper:
def __init__(self):
self.session = requests.session()
self.session.headers.update({
'user-agent': 'mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/91.0.4472.124 safari/537.36'
})

chrome_options = options()
chrome_options.add_argument("--headless")
self.driver = webdriver.chrome(options=chrome_options)

def fetch_api_data(self, url, params=none):
response = self.session.get(url, params=params)
response.raise_for_status()
return response.json()

def fetch_ajax_data(self, url):
self.driver.get(url)

# 等待ajax内容加载
webdriverwait(self.driver, 10).until(
ec.presence_of_element_located((by.class_name, "ajax-content"))
)

# 提取数据
data = self.driver.execute_script("return window.ajaxdata;")
return data

def scrape_website(self, base_url, api_endpoint):
# 爬取主页面
main_page = self.session.get(base_url)
main_page.raise_for_status()

# 爬取api数据
api_data = self.fetch_api_data(api_endpoint)

# 爬取ajax加载的数据
ajax_data = self.fetch_ajax_data(base_url)

return {
'main_page': main_page.text,
'api_data': api_data,
'ajax_data': ajax_data
}

def close(self):
self.driver.quit()

# 使用示例
def main():
scraper = advancedscraper()
try:
data = scraper.scrape_website(
'https://example.com',
'https://api.example.com/data'
)
print(json.dumps(data, indent=2))
finally:
scraper.close()

if __name__ == '__main__':
main()

  1. 注意事项和最佳实践
  • 遵守网站的robots.txt规则和使用条款。
  • 实现请求延迟和重试机制,避免对服务器造成过大负担。
  • 正确处理https证书,特别是对于自签名证书。
  • 使用会话(session)对象来维持cookies和连接池。
  • 对于大规模爬虫,考虑使用异步库如aiohttp来提高效率。
  • 定期检查和更新你的爬虫代码,因为网站结构和api可能会改变。
  • 使用代理服务器轮换ip地址,避免被封禁。
  • 妥善保管api密钥和客户端证书等敏感信息。

这个详细指南涵盖了ajax数据爬取和https访问的主要方面。通过结合使用requests库和selenium,你可以处理大多数现代网站的爬取需求。记住,网络爬虫应该以负责任和合法的方式进行,尊重网站所有者的权利和服务器资源。

感谢提供:05互联