此文章仅供合法用途,请勿违反法律!

        据一些网络调查显示,大约40%的爬虫任务属于Ajax网站。所谓Ajax网站,就是内容动态生成的网站,Ajax网站的最大特征就是翻页时url没有变化,因此如果用selenium的get方法是无法获得网站的信息的,因为使用selenium时网站的源码在翻页或刷新后仍然是前一页的源码,我们想要的新信息在新的一页,所以webdriver.find_elements()方法是无法获得新信息的。

        爬取Ajax网站的网站最重要的步骤就是获取真正的从服务器获取信息的url,而不是网址的url。以东方财富网为例,如何获取真正的url请参考CSDN文章《爬虫案例5——爬取东方财富网的港股数据》。

        获取到真正的url之后,就可以用request包来爬取数据了。以下是我爬取东方财富网cpi数据的代码,供大家参考。我的系统是mac,大家注意要把代码转换成自己的系统。

import requests
import re
import openpyxl


url=("https://datacenter-web.eastmoney.com/api/data/v1/get?callback=datatable3948764&columns=REPORT_DATE%2CTIME%2CNATIONAL_SAME%2CNATIONAL_BASE%2CNATIONAL_SEQUENTIAL%2CNATIONAL_ACCUMULATE%2CCITY_SAME%2CCITY_BASE%2CCITY_SEQUENTIAL%2CCITY_ACCUMULATE%2CRURAL_SAME%2CRURAL_BASE%2CRURAL_SEQUENTIAL%2CRURAL_ACCUMULATE&pageNumber=1&pageSize=20&sortColumns=REPORT_DATE&sortTypes=-1&source=WEB&client=WEB&reportName=RPT_ECONOMY_CPI&_=1739344903750")
#要用真正的url而不是网址,详情见CSDN文章《爬虫案例5——爬取东方财富网的港股数据》
htmlfile = requests.post(url)
print(htmlfile.text)
timepattern = '(\\d)(\\d)(\\d)(\\d)[\u4E00-\u9FA5](\\d{2})[\u4E00-\u9FA5]{2,4}'
cpipattern =  '[A-Za-z0-9_][A-Za-z0-9_][A-Za-z0-9_][A-Za-z0-9_][A-Za-z0-9_][A-Za-z0-9_][A-Za-z0-9_][A-Za-z0-9_]\\BASE\\"\\:(\\d)(\\d)(\\d)?(.)?(\\d)?'
fn = '/Users/lpl/Desktop/gold.xlsx'
wb = openpyxl.load_workbook('/Users/l/Desktop/gold.xlsx')
ws = wb.active
dates = re.findall(timepattern,htmlfile.text)
cpis = re.findall(cpipattern,htmlfile.text)
print(dates)
print(cpis)
dateEmpty = []
cpiEmpty = []
for date in dates:
    strDate = "".join(date)
    dateEmpty.append(strDate)
for cpi in cpis:
    strcpi = "".join(cpi)
    cpiEmpty.append(strcpi)
ws.append(dateEmpty)
ws.append(cpiEmpty)
wb.save('/Users/l/Desktop/gold.xlsx')

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐