抓取网页数据工具(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
基本操作后,文章被存储