方法三 界面模拟登记加XHR接口
在集思录https://www.jisilu.cn/data/cbnew/#cb 页面中,打开开发人员工具后,刷新页面,可以在网络中过滤XHR,很容易发现数据的获取接口是类似这么一个链接
https://www.jisilu.cn/data/cbnew/cb_list_new/?___jsl=LST___t=1732953976728,
猜测,后缀的一串数字是time参数,先把地址直接复制到浏览器里,看看返回数据
可以看到,能够正常返回数据,但是针对游客仅显示前30条。那想办法模拟登录,携带cookies再访问应该就可以了。
为了方便获取cookies,这里使用requestium模块来完成这个小爬虫。
Requestium 简介:
Requestium 是一个 Python 库,它将 Requests、Selenium 和 Parsel 的功能合并为一个用于自动化 web 操作的集成工具。该库是为编写 web 自动化脚本而创建的,这些脚本主要使用请求编写,但能够在维护会话的同时,无缝切换到网站中 JavaScript 密集部分的 Selenium。Requestium 为 Requests 和 Selenium 添加了独立的改进,并且每一个新功能都经过了延迟评估,因此即使编写只使用 Requests 或 Selenium 的脚本,它也很有用。
首先,使用requestium模块模拟登录,这块代码和selenium几乎完全一样,改一下函数名称就行。
from webdriver_manager.chrome import ChromeDriverManager
from requestium import Session, Keys
import time
import json
user='XXXXXX'
password='XXXXXX'
s = Session(headless=False,webdriver_path=ChromeDriverManager().install())
s.driver.get('https://www.jisilu.cn/account/login/')
s.driver.ensure_element_by_xpath("/html/body/div[3]/div/div/div[1]/div[1]/div[3]/form/div[2]/input").send_keys(user)
s.driver.ensure_element_by_xpath("/html/body/div[3]/div/div/div[1]/div[1]/div[3]/form/div[3]/input").send_keys(password)
s.driver.ensure_element_by_xpath("/html/body/div[3]/div/div/div[1]/div[1]/div[3]/form/div[5]/div[1]/input").send_keys(Keys.SPACE)
s.driver.ensure_element_by_xpath("/html/body/div[3]/div/div/div[1]/div[1]/div[3]/form/div[5]/div[2]/input").send_keys(Keys.SPACE)
s.driver.ensure_element_by_xpath("/html/body/div[3]/div/div/div[1]/div[1]/div[3]/form/div[6]/a").send_keys(Keys.ENTER)
如果想用headless模式,这个地方改一下:s = Session(headless=False,webdriver_path=ChromeDriverManager().install())
登录之后,获取cookies。
使用time.time()构造接口的后缀,不知道网页是怎么构造的,我随意乘以1000,测试后好使。就不深究细节了,能用就行。
而后可以直接携带cookies,访问构造的接口地址,也就是从XHR接口获取返回的数据。
time_pad=int(time.time()*1000)
jisilu_kzz_url=f'https://www.jisilu.cn/data/cbnew/cb_list_new/?___jsl=LST___t={time_pad}'
time.sleep(1)
s.cookies.clear()
s.transfer_driver_cookies_to_session()
res_text=s.post(jisilu_kzz_url).text
稍微加工一下返回的数据,工整的可转债表格数据就到手了。
res_text_row=(json.loads(res_text))['rows']
from pandas import json_normalize
res_df = json_normalize([x['cell'] for x in res_text_row], sep='_')
res_df.to_excel('all_talble_方法3.xlsx',index=False)
本方法中获取到的数据表格,和方法一、方法二获取的表格完全不同,数据信息更多,能够直接使用。