抓取网页数据工具(1.虎嗅资讯网数据--请求查阅该请求的方式)

优采云 发布时间: 2022-02-11 01:28

  抓取网页数据工具(1.虎嗅资讯网数据--请求查阅该请求的方式)

  1.虎嗅网文章数据----写在前面

  今天继续使用pyspider爬取数据。不幸的是,虎秀信息网被我选中了。该网站是其信息渠道。此文章仅用于学习交流,不得用于其他用途。

  一般操作,分析要爬取的页面

  将页面拖到底部,会发现一个load more按钮,点击后,抓取请求,得到如下地址

  

  2.虎嗅网文章数据----分析请求

  查看请求的方法和地址,包括参数,如下图

  

  获取以下信息

  页面请求地址为: 请求方式:POST 请求参数比较重要的是一个叫page的参数

  我们只需要根据以上内容编写pyspider代码部分即可。在on_start函数里面写一个循环事件,注意有一个数字2025,就是我刚才从请求中看到的总页数。当您阅读此 文章 时,这个数字应该更大。

  1 @every(minutes=24 * 60)

2 def on_start(self):

3 for page in range(1,2025):

4 print("正在爬取第 {} 页".format(page))

5 self.crawl('https://www.huxiu.com/v2_action/article_list', method="POST",data={"page":page},callback=self.parse_page,validate_cert=False)

6

  页面生成后,会调用parse_page函数解析爬取URL成功后crawl()方法返回的Response响应。

  1 @config(age=10 * 24 * 60 * 60)

2 def parse_page(self, response):

3 content = response.json["data"]

4 doc = pq(content)

5 lis = doc('.mod-art').items()

6 data = [{

7 'title': item('.msubstr-row2').text(),

8 'url':'https://www.huxiu.com'+ str(item('.msubstr-row2').attr('href')),

9 'name': item('.author-name').text(),

10 'write_time':item('.time').text(),

11 'comment':item('.icon-cmt+ em').text(),

12 'favorites':item('.icon-fvr+ em').text(),

13 'abstract':item('.mob-sub').text()

14 } for item in lis ]

15 return data

16

  最后定义一个on_result()方法,专门用来获取return的结果数据。这个用来接收上面parse_page()返回的数据数据,其中的数据可以保存到MongoDB中。

  1'''

2遇到不懂的问题?Python学习交流群:821460695满足你的需求,资料都已经上传群文件,可以自行下载!

3'''

4 # 页面每次返回的数据

5 def on_result(self,result):

6 if result:

7 self.save_to_mongo(result)

8

9

10 # 存储到mongo数据库

11 def save_to_mongo(self,result):

12 df = pd.DataFrame(result)

13 content = json.loads(df.T.to_json()).values()

14 if collection.insert_many(content):

15 print('存储数据成功')

16 # 暂停1s

17 time.sleep(1)

18

  好的,保存代码,修改每秒运行次数和并发

  

  点击run运行代码,但是运行之后会发现程序在抓取一个页面后就停止了。pyspider 使用 URL 的 MD5 值作为唯一 ID 号。如果 ID 号相同,则视为同一任务。再次爬行。

  GET请求的分页URL一般不一样,所以ID号也会不一样,可以爬到多个页面。POST 请求的 URL 相同。第一个页面被爬取后,后面的页面将不会被爬取。

  解决方法是重写ID号的生成方法,在on_start()方法前添加如下代码:

  1 def get_taskid(self,task):

2 return md5string(task['url']+json.dumps(task['fetch'].get('data','')))

3

  基本操作后,文章被存储

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线