新闻中心
新闻中心与新手教程
新闻中心与新手教程
发布时间:2024-10-10 23:42:09
我会为您详细介绍如何使用python爬虫处理ajax数据爬取和https访问。这两个主题在现代网络爬虫中非常重要,因为许多网站使用ajax动态加载内容,而https则是当前网络安全的标准。让我们逐步深入探讨这两个主题。
ajax(asynchronous javascript and xml)允许网页在不刷新整个页面的情况下更新部分内容。爬取ajax加载的数据通常有两种方法:直接请求api或使用浏览器自动化工具。
1.1 直接请求api
步骤: a) 使用浏览器开发者工具分析网络请求 b) 找到ajax请求的url、参数和头信息 c) 使用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来模拟真实的浏览器行为。
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))
https(http secure)是http的安全版本,使用ssl/tls进行加密。python的requests库默认支持https,但有时可能需要额外配置。
2.1 基本https请求
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证书验证问题,特别是对于自签名证书。
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服务可能需要客户端证书认证。
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}")
让我们创建一个更复杂的爬虫,它能处理ajax加载的内容和https连接:
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()
这个详细指南涵盖了ajax数据爬取和https访问的主要方面。通过结合使用requests库和selenium,你可以处理大多数现代网站的爬取需求。记住,网络爬虫应该以负责任和合法的方式进行,尊重网站所有者的权利和服务器资源。
感谢提供:05互联