第一,你的目的或意图是什么,对于本例而言,我需要获取任意某页至某页信托在售产品的下面数据:产品名称、发行机构、发行时间、最高收益、产品期限、投资行业、发行地、收益分配方式、发行规模、最低收益、最高收益和利率等级划分情况这12个数据。
第二,如果是人,需要哪些动作来达到这个目的。我们来看下网页。动作就清晰了:
输入网址/搜索关键字 > 进入网站 > 点击红色框框里的信托产品和在售 > 录入下面绿色框框里的相关信息 > 发现信息不全,再点击这个产品,在详情页(再下一张图)继续录入。
2、开始爬取
既然动作清晰了,那就可以让计算机来模拟人的这个动作进行爬取了。
然后就是写代码的逻辑了。我们用做数学题常用的倒推法来梳理这个过程。
要想获取数据 < 你得解析网页给你的响应 < 你得有个响应 < 你得发送请求 < 你得有个请求request < 你得有个url。
然后我们再正过来解题:获取url > 构建request > 发送请求 > 获取响应 > 解析响应 > 获取所需数据 > 保存数据。
所以按照这个步骤,我们可以先做出一个大框架,然后在框架的基础上补充血肉。大框架,就是定义个主函数。
值得注意的是,本例中,每个产品的信息获取,我们都有二次点击的动作,即第一页数据不全,我们再点击进入详情页进行剩余数据的获取,因此,本例是有两层的数据获取过程的。第一层使用正则表达式,第二层使用bs4。
① 定义主函数
如下是这个主函数,前面的写入相关数据你可以先不管,这都是在第一步的获取url时,后补过来的。
回到前面的目的:提取任意某页至任意某页的数据,所以写个循环是必须的,然后在循环下方,两层网页的数据获取框架就出来了。(由于第二层网页的url是根据第一层网页的某个数据拼接出来的,而第一层网页是一下子提取整个页面所有产品的信息,所以第二层网页的提取也设置了个循环,对第一层网页的所有产品,一个一个点进去进行提取)
- # 定义一个主函数
- def main():
-
- # 写入相关数据
- url_1 = 'http://www.某信托网.com/Action/ProductAJAX.ashx?'
- url_2 = 'http://www.某信托网/Product/Detail.aspx?'
- size = input('请输入每页显示数量:')
- start_page = int(input('请输入起始页码:'))
- end_page = int(input('请输入结束页码'))
- type = input('请输入产品类型(1代表信托,2代表资管):')
- items = [] # 定义一个空列表用来存储数据
-
- # 写循环爬取每一页
- for page in range(start_page, end_page + 1):
-
- # 第一层网页的爬取流程
- print('第{}页开始爬取'.format(page))
-
- # 1、拼接url——可定义一个分函数1:joint
- url_new = joint(url_1 ,size=size ,page=page ,type=type)
-
- # 2、发起请求,获取响应——可定义一个分函数2:que_res
- response = que_res(url_new)
-
- # 3、解析内容,获取所需数据——可定义一个分函数3:parse_content_1
- contents = parse_content_1(response)
-
- # 4、休眠2秒
- time.sleep(2)
-
- # 第二层网页的爬取流程
-
- for content in contents:
- print(' 第{}页{}开始下载'.format(page ,content[0]))
-
- # 1、拼接url
- id = content[0]
- url_2_new = joint(url_2 ,id=id) # joint为前面定义的第1个函数
-
- # 2、发起请求,获取响应
- response_2 = que_res(url_2_new) # que_res为前面定义的第2个函数
-
- # 3、解析内容,获取所需数据——可定义一个分函数4:parse_content_2,直接返回字典格式的数据
- item = parse_content_2(response_2 ,content)
-
- # 存储数据
- items.append(item)
- print(' 第{}页{}结束下载'.format(page ,content[0]))
-
- # 休眠5秒
- time.sleep(5)
-
- print('第{}页结束爬取'.format(page))
-
- # 保存数据为dataframe格式CSV文件
- df = pd.DataFrame(items)
- df.to_csv('data.csv' ,index=False ,sep=',' ,encoding='utf-8-sig')
-
- print('*'*30)
- print('全部爬取结束')
-
- if __name__ == '__main__':
- main()
② 获取url —— 第一层和第二层通用
由于我们需要访问两层的数据,所以希望定义一个函数,能对两层的URL都可以进行拼接。 (编辑:核心网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|