最近有同学需要爬取一网页的中的表格,但是实际操作中遇到所要抓取的数据在另一框架中table标签中,切换不同页码,实际的url不会变化,下面主要分难点解决、代码展示和代码结构解析三部分讲述。

一、难点解决

(1)原始网页

python selenium 读取ajax请求 python获取ajax请求_html


(2)疑惑

要获取的数据为ajax异步请求,切换页码,网页的url也未发生变化,使用switch_to.frame也未获取信息。

几经折腾,通过开发者工具获取到异步请求的url,详见下图:

python selenium 读取ajax请求 python获取ajax请求_html_02


python selenium 读取ajax请求 python获取ajax请求_取文本_03


通过观察,可以看到url中包含page的参数,代码中将url进行拼接,从而实现全部表格的获得。

二、代码展示

#coding=utf-8
from bs4 import BeautifulSoup
 from urllib import request
 import xlwtdef get_text(url):
 “”"
 :param url:
 :return: r.text
 “”"
#该函数功能:获取html文本信息
response = request.urlopen(url,timeout = 30)
html =response.read()
html_text = html.decode("utf-8")
return  html_text

def get_datas(datas,html_text):
“”"
该函数主要实现获取表格中的数据
:param datas: 存放以前表格中数据,本次在里面继续追加
:param html_text: 本次网页html文档信息
:return:
“”"
soup = BeautifulSoup(html_text,“html.parser”)

#第一步:定位到table
table = soup.find_all("table")
#第二步:定位到tr
tab = table[0]
for tr in tab.findAll('tr'):
    data = []
    for td in tr.findAll('td'):
        td_text = td.getText()
        if td_text in ['证书编号', '资质类型', '企业名称', '资质资格序列', '专业类别', '资质资格等级']:
            continue
        else:
            data.append(td_text)
    if data == []:
        continue
    else:
        datas.append(data)
return datas

def write_xls (datas):

book = xlwt.Workbook()
sheet1 = book.add_sheet("sheet1",cell_overwrite_ok= True)

i = 0
for list in datas:
    j = 0
    for data in list:
        sheet1.write(i,j,data)
        j += 1
    i += 1
book.save("资料.xls")
print("保存完成")

def main():
total_pages = 10
#datas用于存放数据的列表
datas = [[‘证书编号’, ‘资质类型’, ‘企业名称’, ‘资质资格序列’, ‘专业类别’, ‘资质资格等级’,""]]
for page in range(total_pages+1):
url= “http://XXXXX?page="+str(page)+"&channelid=264649&perpage=15&outlinepage=10&zsbh=&qymc=&zzlx=”
html_text = get_text(url)
datas = get_datas(datas,html_text)
print(datas)

write_xls(datas)

if name == “main”:
main()
三、代码结构
代码主要包含
(1)主函数:main()
主函数逻辑:
定义初始化参数:total_pages(总共需要遍历的页数);datas(用来存放爬取的数据,由于表格中每个表格中都有表头,直接将表头初始化,之后每一页不再存储表头)
|
for循环遍历每一页:每一页先获取html文本——》获取文本中详细数据函数
|
执行完毕后,将数据写入excel文件函数:write_xls (datas)

(2)获取html文本信息函数:get_text(url)
该模块使用request模块,打开url并获取html文本

(3)获取文本中详细数据函数:get_datas(datas,html_text)
使用beatifulsoup进行网页信息的解析,通过table——》tr——》td逐级进行定位,最终使用getText()的方法获取文本信息。

(4)将数据写入excel文件函数:write_xls (datas)
使用xlwt模块,进行将列表datas写入excel中,代码使用双重for循环实现即可。