CN113742551A - 一种基于scrapy和puppeteer的动态数据抓取方法 - Google Patents

一种基于scrapy和puppeteer的动态数据抓取方法 Download PDF

Info

Publication number
CN113742551A
CN113742551A CN202111045471.0A CN202111045471A CN113742551A CN 113742551 A CN113742551 A CN 113742551A CN 202111045471 A CN202111045471 A CN 202111045471A CN 113742551 A CN113742551 A CN 113742551A
Authority
CN
China
Prior art keywords
data
script
puppeteer
request
dynamic
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
CN202111045471.0A
Other languages
English (en)
Inventor
谭文婷
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Guizhou Electronic Commerce Cloud Operation Co ltd
Original Assignee
Guizhou Electronic Commerce Cloud Operation Co ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Guizhou Electronic Commerce Cloud Operation Co ltd filed Critical Guizhou Electronic Commerce Cloud Operation Co ltd
Priority to CN202111045471.0A priority Critical patent/CN113742551A/zh
Publication of CN113742551A publication Critical patent/CN113742551A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/95Retrieval from the web
    • G06F16/951Indexing; Web crawling techniques
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/95Retrieval from the web
    • G06F16/955Retrieval from the web using information identifiers, e.g. uniform resource locators [URL]
    • G06F16/9566URL specific, e.g. using aliases, detecting broken or misspelled links
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F16/00Information retrieval; Database structures therefor; File system structures therefor
    • G06F16/90Details of database functions independent of the retrieved data types
    • G06F16/95Retrieval from the web
    • G06F16/958Organisation or management of web site content, e.g. publishing, maintaining pages or automatic linking
    • G06F16/972Access to data in other repository systems, e.g. legacy data or dynamic Web page generation

Landscapes

  • Engineering & Computer Science (AREA)
  • Databases & Information Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Data Mining & Analysis (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Transfer Between Computers (AREA)

Abstract

本发明涉及一种基于scrapy和puppeteer的动态数据抓取方法,本发明所述的动态数据抓取方法包括以下步骤:步骤1):分析网络请求;步骤2):分析动态网络请求;步骤3):安装scrapy‑redis;步骤4):设置爬虫的初始url;步骤5):提前定义scrapy.Item对象;步骤6):在pipeline中处理Item对象;步骤7):puppeteer监听redis队列;步骤8):等待页面加载完成,获取页面html,通过xpath提取目标数据;步骤9):将目标数据直接插入、或通过id更新到mongodb中持久化保存。本发明结合了scrapy和puppeteer两者的优势,将数据进行分类,实现快速高效的采集,puppeteer采集异步加载的、API加密的、复杂的数据,本发明通过redis进行通信,易于扩展。

Description

一种基于scrapy和puppeteer的动态数据抓取方法
技术领域
本发明属数据获取技术领域,尤其是涉及一种基于scrapy和puppeteer的动态数据抓取方法技术领域。
背景技术
随着网络技术的不断发展,越来越多的网站采用了动态网页技术,通过使用ajax异步获取内容,再通过JavaScript渲染,API的安全防护也越来越完善。这些极大提升了用户的体验和数据安全,但是也给爬虫带来了新的挑战。scrapy是一套目前非常流行的爬虫框架,可以快速的高效抓取网站并从其页面中提取结构化数据,支持异步、并发、去重,但是只能采集到静态展示的数据,和通过api稳定获取的数据,很多异步加载的数据、接口带有随机参数无法破解的数据则无法采集。对于这部分数据,可以使用模拟浏览器的方式来采集。主流的模拟浏览器方式有两种:一种是使用selenium定位到元素位置来获取数据,不过selenium是专为自动化测试开发的工具,运行速度慢、不稳定、无法截取网络请求;另一种puppeteer则具有更强大的功能,可以通过截取ajax响应直接获取到动态的请求数据,采集速度更快。为实现动态数据采集的高效获取,需要开发一套新的抓取方法。
发明内容
本发明正是为了解决上述问题缺陷,提供一种基于scrapy和puppeteer的动态数据抓取方法。本发明结合scrapy和puppeteer的优点,开发一套方法用于数据采集,使用scrapy采集静态数据,速度更快,将动态页面的请求交给puppeteer来处理,解决技术难题。中间使用redis通信,实现分布式处理任务,易于扩展。本发明是一套高并发、易扩展、能处理动态请求的爬虫采集方法。
本发明采用如下技术方案实现。
一种基于scrapy和puppeteer的动态数据抓取方法,本发明所述的动态数据抓取方法包括以下步骤:
步骤1):分析网络请求,分析待采集数据哪些是静态数据,哪些是动态数据;静态数据放入scrapy中采集;
步骤2):分析动态网络请求,判断API接口是否能否稳定的返回数据;如是,将该动态数据放到scrapy中采集;如否,则将该动态数据放到puppeteer中采集;
步骤3):安装scrapy-redis,使scrapy支持分布式采集;
步骤4):设置爬虫的初始url,scrapy将用GET方法来请求该url,请求成功以后自动调用默认的回调函数parse返回请求结果;当请求完成以后,scrapy将请求返回的结果response作为参数传递给回调函数;
步骤5):提前定义scrapy.Item对象,将需要的目标数据定义为Item的属性;在回调函数中分析response内容;
步骤6):在pipeline中处理Item对象;
步骤7):puppeteer监听redis队列,当队列中有数据时,取出保存的url和其他的一些关键信息,启动chromium,打开目标网站url;
步骤8):等待页面加载完成,获取页面html,通过xpath提取目标数据;
步骤9):将目标数据直接插入、或通过id更新到mongodb中持久化保存。
进一步为,本发明所述的步骤1)具体为:分析网络请求:使用chrome的开发者工具查看目标网页的网络请求,分析待采集数据哪些是静态数据,哪些是动态数据;静态数据为:在Doc类型的网络请求中返回的html里能获取到的数据;动态数据为没有在Doc类型的网络请求中返回,而是需要额外调用ajax发送的请求返回的数据;静态数据放入scrapy中采集。
进一步为,本发明所述的步骤2)具体为:分析动态网络请求:使用postman工具尝试手动多次发送从步骤1获取到的ajax请求,根据相同的要素,查看返回结果是否能得目标数据,查看是否每次都能得到相同的返回结果,从而判断API接口是否能否稳定的返回数据;如果每次都能得到想要的目标数据,表示接口能够稳定返回数据,则将这部分动态数据放到scrapy中采集,如果不能稳定返回,则将这部分动态数据放到puppeteer中采集。
进一步为,本发明所述的步骤2)中:所述的相同的要素为url、请求头、cookies。
进一步为,本发明所述的步骤4)包括:初始的url请求使用重写scrapy的start_requests方法,从数据库、redis中读取所有的初始url,手动定义请求头、cookies、参数,并设置自定义的回调函数。
进一步为,本发明所述的步骤5)包括:创建一个Item对象,将具体目标数据赋值到对应的属性中,最后把封装成的Item对象返回。
进一步为,本发明所述的步骤5)包括:如果返回的是html类型的数据,使用xpath提取数据。
进一步为,本发明所述的步骤5)包括:如果返回json类型的数据,使用json_dumps提取数据。
进一步为,本发明所述的步骤6)包括:将已经采集到的目标数据放入mongodb中持久化保存;没有采集到的数据,比如页面的url、数据id等关键字段打包放入到redis队列中。
进一步为,本发明所述的步骤8)为:监听http请求的响应事件,当API接口一返回数据,触发响应事件,在该事件的回调函数里处理返回的内容;如果是html类型的数据,使用xpath提取数据;如果是json类型的数据,使用json_dump提取数据。
本发明的有益效果为,本发明结合了scrapy和puppeteer两者的优势,将数据进行分类,静态数据和可以通过API稳定获取到的数据放入scrapy采集,实现快速高效的采集。puppeteer可以采集异步加载的、API加密的、复杂的数据。通过redis进行通信,易于扩展。根据具体采集的不同种类数据的多少,增加或减少对应的scrapy、puppeteer服务器就可以保持采集到高性能状态。
下面结合附图和具体实施方式本发明做进一步解释。
附图说明
图1为本发明具体实施例方法流程示意图。
具体实施方式
一种基于scrapy和puppeteer的动态数据抓取方法,所述的动态数据抓取方法包括以下步骤:
1.分析网络请求:使用chrome的开发者工具查看目标网页的网络请求,分析待采集数据哪些是静态的,哪些是通过ajax请求得到的。
在Doc类型的网络请求中返回的html里能获取到的数据,我们称之为静态数据;反之没有在Doc类型的网络请求中返回,而是需要额外调用ajax发送的请求返回的数据,我们称之为动态数据。这部分静态数据放入scrapy中采集。
2.分析动态网络请求:使用postman工具尝试手动多次发送从步骤1获取到的ajax请求,根据相同的url、请求头、cookies、参数,查看返回结果是否能得目标数据,查看是否每次都能得到相同的返回结果,从而判断API接口是否能否稳定的返回数据。
如果每次都能得到想要的目标数据,表示接口能够稳定返回数据,则将这部分动态数据也放到scrapy中采集,如果不能稳定返回,则将这部分动态数据放到puppeteer中采集。
3.安装scrapy-redis,使scrapy可以支持分布式采集。
4.设置爬虫的初始url,scrapy将用GET方法来请求该url,请求成功以后自动调用默认的回调函数parse返回请求结果。
如果初始的url请求比较复杂,可以重写scrapy的start_requests方法,从数据库、redis中读取所有的初始url,手动定义请求头、cookies、参数,并设置自定义的回调函数。
当请求完成以后,scrapy将请求返回的结果response作为参数传递给回调函数。
5.提前定义scrapy.Item对象,将需要的目标数据定义为Item的属性。在回调函数中分析response内容。
如果返回的是html类型的数据,使用xpath提取数据;
如果返回json类型的数据,json_dumps提取数据。
创建一个Item对象,将刚才的提取到的具体目标数据赋值到对应的属性中,最后把封装成的Item对象返回。
6.在pipeline中处理Item对象。
将已经采集到的目标数据放入mongodb中持久化保存;
没有采集到的数据,比如页面的url、数据id等关键字段打包放入到redis队列中。
7.puppeteer监听redis队列,当队列中有数据时,取出保存的url和其他的一些关键信息,启动chromium,打开目标网站url。
8.等待页面加载完成,获取页面html,通过xpath提取目标数据。
或者监听http请求的响应事件,当API接口一返回数据,触发响应事件,在该事件的回调函数里处理返回的内容,
如果是html类型的数据,使用xpath提取数据,
如果是json类型的数据,使用json_dump提取数据。
监听http请求的响应事件可以不必等待页面全部加载完毕,对于有大量动态请求的网页来说,节省了采集的时间和服务器带宽。
9.最后将目标数据直接插入、或通过id更新到mongodb中持久化保存。
见图1所示:
实施例:
1.采集一个电商网站,包含商品列表页和商品详情页。列表页包含商品id和商品名称,详情页包含商品的价格和销量。
2.在电脑上安装scrapy、scrapy-redis、puppeteer、chrome、mongodb、redis、postman。
3.打开chrome,跳转到商品列表页,使用chrome的开发者工具查看所有网络请求,分析发现Doc类型请求中没有商品的列表数据,列表数据是动态加载的。在XHR类型的请求中找到关键的API能够返回商品列表。打开postman,在postman中使用相同的url、请求头、cookies、参数,手动多次发送请求,可以返回商品列表,并且每次请求都可以得到相同的商品列表,表示可以通过该API稳定获取到商品列表。所以列表页数据放入scrapy中采集。
4.打开chrome,跳转到商品详情页,使用chrome的开发者工具查看所有网络请求,分析发现Doc类型请求中没有商品的价格和销量数据,该数据是动态加载的。在XHR类型的请求中找到关键的API能够返回商品价格和销量。打开postman,在postman中使用相同的url、请求头、cookies、参数,手动多次发送请求,发现只有第一次请求能够成功返回商品价格和销量,后面再次请求返回错误。原因是获取商品API参数带有一个token,该token使用过后会失效,目前的技术还不能破解token生成的原理,不能通过API稳定获取到数据。所以详情页数据放到puppeteer中采集。
5.设置列表页作为初始url,并设置回调函数。在回调函数中得到json类型的响应数据,json_dumps提取出数据,创建Item对象,将商品的id和商品名称赋值到Item对象的属性中返回。
6.在pipeline中处理Item对象。先将id和商品名称放入mongodb中持久化保存,再将商品id放入到redis队列中。
7.puppeteer监听redis队列,当队列中有数据时,取出商品id,拼接成商品详情页的url,启动chromium,打开url。
8.监听获取详情API响应,设置响应回调函数。在回调函数中得到json类型的响应数据,提取出商品的价格和销量。
9.最后通过id,把商品的价格和销量数据更新到mongodb中持久化保存。
以上所述的仅是本发明的部分具体实施例,方案中公知的具体内容或常识在此未作过多描述。应当指出,上述实施例不以任何方式限制本发明,对于本领域的技术人员来说,凡是采用等同替换或等效变换的方式获得的技术方案均落在本发明的保护范围内。本申请要求的保护范围应当以其权利要求的内容为准,说明书中的具体实施方式等记载可以用于解释权利要求的内容。

Claims (10)

1.一种基于scrapy和puppeteer的动态数据抓取方法,其特征在于,所述的动态数据抓取方法包括以下步骤:
步骤1):分析网络请求,分析待采集数据哪些是静态数据,哪些是动态数据;静态数据放入scrapy中采集;
步骤2):分析动态网络请求,判断API接口是否能否稳定的返回数据;如是,将该动态数据放到scrapy中采集;如否,则将该动态数据放到puppeteer中采集;
步骤3):安装scrapy-redis,使scrapy支持分布式采集;
步骤4):设置爬虫的初始url,scrapy将用GET方法来请求该url,请求成功以后自动调用默认的回调函数parse返回请求结果;当请求完成以后,scrapy将请求返回的结果response作为参数传递给回调函数;
步骤5):提前定义scrapy.Item对象,将需要的目标数据定义为Item的属性;在回调函数中分析response内容;
步骤6):在pipeline中处理Item对象;
步骤7):puppeteer监听redis队列,当队列中有数据时,取出保存的url和其他的一些关键信息,启动chromium,打开目标网站url;
步骤8):等待页面加载完成,获取页面html,通过xpath提取目标数据;
步骤9):将目标数据直接插入、或通过id更新到mongodb中持久化保存。
2.根据权利要求1所述的基于scrapy和puppeteer的动态数据抓取方法,其特征在于,所述的步骤1)具体为:分析网络请求:使用chrome的开发者工具查看目标网页的网络请求,分析待采集数据哪些是静态数据,哪些是动态数据;静态数据为:在Doc类型的网络请求中返回的html里能获取到的数据;动态数据为没有在Doc类型的网络请求中返回,而是需要额外调用ajax发送的请求返回的数据;静态数据放入scrapy中采集。
3.根据权利要求1所述的基于scrapy和puppeteer的动态数据抓取方法,其特征在于,所述的步骤2)具体为:分析动态网络请求:使用postman工具尝试手动多次发送从步骤1获取到的ajax请求,根据相同的要素,查看返回结果是否能得目标数据,查看是否每次都能得到相同的返回结果,从而判断API接口是否能否稳定的返回数据;如果每次都能得到想要的目标数据,表示接口能够稳定返回数据,则将这部分动态数据放到scrapy中采集,如果不能稳定返回,则将这部分动态数据放到puppeteer中采集。
4.根据权利要求2所述的基于scrapy和puppeteer的动态数据抓取方法,其特征在于,所述的步骤2)中:所述的相同的要素为url、请求头、cookies、参数。
5.根据权利要求1所述的基于scrapy和puppeteer的动态数据抓取方法,其特征在于,所述的步骤4)包括:初始的url请求使用重写scrapy的start_requests方法,从数据库、redis中读取所有的初始url,手动定义请求头、cookies、参数,并设置自定义的回调函数。
6.根据权利要求1所述的基于scrapy和puppeteer的动态数据抓取方法,其特征在于,所述的步骤5)包括:创建一个Item对象,将具体目标数据赋值到对应的属性中,最后把封装成的Item对象返回。
7.根据权利要求6所述的基于scrapy和puppeteer的动态数据抓取方法,其特征在于,所述的步骤5)包括:如果返回的是html类型的数据,使用xpath提取数据。
8.根据权利要求6所述的基于scrapy和puppeteer的动态数据抓取方法,其特征在于,所述的步骤5)包括:如果返回json类型的数据,使用json_dumps提取数据。
9.根据权利要求1所述的基于scrapy和puppeteer的动态数据抓取方法,其特征在于,所述的步骤6)包括:将已经采集到的目标数据放入mongodb中持久化保存;没有采集到的数据,比如页面的url、数据id关键字段打包放入到redis队列中。
10.根据权利要求1所述的基于scrapy和puppeteer的动态数据抓取方法,其特征在于,所述的步骤8)为:监听http请求的响应事件,当API接口一返回数据,触发响应事件,在该事件的回调函数里处理返回的内容;如果是html类型的数据,使用xpath提取数据;如果是json类型的数据,使用json_dump提取数据。
CN202111045471.0A 2021-09-07 2021-09-07 一种基于scrapy和puppeteer的动态数据抓取方法 Pending CN113742551A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202111045471.0A CN113742551A (zh) 2021-09-07 2021-09-07 一种基于scrapy和puppeteer的动态数据抓取方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202111045471.0A CN113742551A (zh) 2021-09-07 2021-09-07 一种基于scrapy和puppeteer的动态数据抓取方法

Publications (1)

Publication Number Publication Date
CN113742551A true CN113742551A (zh) 2021-12-03

Family

ID=78736825

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202111045471.0A Pending CN113742551A (zh) 2021-09-07 2021-09-07 一种基于scrapy和puppeteer的动态数据抓取方法

Country Status (1)

Country Link
CN (1) CN113742551A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113934914A (zh) * 2021-12-20 2022-01-14 成都橙视传媒科技股份公司 一种针对新闻媒体批量加密数据的采集方法
CN116910393A (zh) * 2023-09-13 2023-10-20 戎行技术有限公司 一种基于递归神经网络的大批量新闻数据采集方法

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106484775A (zh) * 2016-09-12 2017-03-08 北京量科邦信息技术有限公司 一种基于selenium的爬虫抓取方法及系统
CN106649810A (zh) * 2016-12-29 2017-05-10 山东舜网传媒股份有限公司 基于Ajax的新闻网页动态数据的抓取方法及系统
CN110569414A (zh) * 2019-08-21 2019-12-13 时趣互动(北京)科技有限公司 一种基于puppeteer的网站数据收集方法
CN111552854A (zh) * 2020-04-24 2020-08-18 北京明略软件系统有限公司 一种网页数据抓取方法、装置、存储介质和设备
WO2021047239A1 (zh) * 2019-09-10 2021-03-18 苏宁云计算有限公司 一种页面获取方法、装置及系统

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN106484775A (zh) * 2016-09-12 2017-03-08 北京量科邦信息技术有限公司 一种基于selenium的爬虫抓取方法及系统
CN106649810A (zh) * 2016-12-29 2017-05-10 山东舜网传媒股份有限公司 基于Ajax的新闻网页动态数据的抓取方法及系统
CN110569414A (zh) * 2019-08-21 2019-12-13 时趣互动(北京)科技有限公司 一种基于puppeteer的网站数据收集方法
WO2021047239A1 (zh) * 2019-09-10 2021-03-18 苏宁云计算有限公司 一种页面获取方法、装置及系统
CN111552854A (zh) * 2020-04-24 2020-08-18 北京明略软件系统有限公司 一种网页数据抓取方法、装置、存储介质和设备

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
云洋;: "基于Scrapy的网络爬虫设计与实现", 电脑编程技巧与维护, no. 09, 18 September 2018 (2018-09-18), pages 21 - 23 *

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113934914A (zh) * 2021-12-20 2022-01-14 成都橙视传媒科技股份公司 一种针对新闻媒体批量加密数据的采集方法
CN116910393A (zh) * 2023-09-13 2023-10-20 戎行技术有限公司 一种基于递归神经网络的大批量新闻数据采集方法
CN116910393B (zh) * 2023-09-13 2023-12-12 戎行技术有限公司 一种基于递归神经网络的大批量新闻数据采集方法

Similar Documents

Publication Publication Date Title
US10567407B2 (en) Method and system for detecting malicious web addresses
US9203720B2 (en) Monitoring the health of web page analytics code
US8413044B2 (en) Method and system of retrieving Ajax web page content
CN105095280B (zh) 一种浏览器缓存方法和装置
US9141611B2 (en) Aggregated web analytics request systems and methods
CN107040584B (zh) 客户端下载图片的方法及装置
US20140304588A1 (en) Creating page snapshots
US10084637B2 (en) Automatic task tracking
CN111177519B (zh) 网页内容获取方法、装置、存储介质及设备
CN112637361B (zh) 一种页面代理方法、装置、电子设备及存储介质
CN113742551A (zh) 一种基于scrapy和puppeteer的动态数据抓取方法
US10291492B2 (en) Systems and methods for discovering sources of online content
CN105550179B (zh) 一种网页收藏方法和浏览器插件
US11729248B2 (en) Web application component migration to a cloud computing system
CN113076501A (zh) 一种页面处理方法、存储介质及设备
CN107368484A (zh) 网页的静态资源文件的压缩方法及装置、获取方法及装置
CN111273964A (zh) 一种数据加载方法及装置
US6658452B1 (en) Schemes for selecting and passing an application from an application provider to an application service provider
US10769388B2 (en) Changing a language for a user session replay
CN111104623A (zh) 网页数据缓存方法、装置、服务器及存储介质
CN111767486A (zh) 用于展示页面的方法、装置、电子设备和计算机可读介质
CN109344344A (zh) 网页客户端的标识方法、服务器及计算机可读存储介质
US9380118B2 (en) Analytics based scoping of HTML5 web storage attributes
Schwanke Faculty Informatics Bachelor of Science–Business Information Systems
CN112784186A (zh) 一种链接地址打开方法、装置、存储介质及电子设备

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination