分页请求json数据_pyspider抓取虎嗅网文章数据
1. 虎嗅網(wǎng)文章數(shù)據(jù)----寫在前面
今天繼續(xù)使用pyspider爬取數(shù)據(jù),很不幸,虎嗅資訊網(wǎng)被我選中了,網(wǎng)址為 https://www.huxiu.com/ 爬的就是它的資訊頻道,本文章僅供學(xué)習(xí)交流使用,切勿用作其他用途。
常規(guī)操作,分析待爬取的頁(yè)面
拖拽頁(yè)面到最底部,會(huì)發(fā)現(xiàn)一個(gè)加載更多按鈕,點(diǎn)擊之后,抓取一下請(qǐng)求,得到如下地址
2. 虎嗅網(wǎng)文章數(shù)據(jù)----分析請(qǐng)求
查閱該請(qǐng)求的方式和地址,包括參數(shù),如下圖所示
得到以下信息
我們只需要按照上面的內(nèi)容,把pyspider代碼部分編寫完畢即可。 on_start 函數(shù)內(nèi)部編寫循環(huán)事件,注意到有個(gè)數(shù)字2025這個(gè)數(shù)字,是我從剛才那個(gè)請(qǐng)求中看到的總頁(yè)數(shù)。你看到這篇文章的時(shí)候,這個(gè)數(shù)字應(yīng)該變的更大了。
@every(minutes=24 * 60)def on_start(self):for page in range(1,2025):print("正在爬取第 {} 頁(yè)".format(page))self.crawl('https://www.huxiu.com/v2_action/article_list', method="POST",data={"page":page},callback=self.parse_page,validate_cert=False)頁(yè)面生成完畢之后,開(kāi)始調(diào)用parse_page 函數(shù),用來(lái)解析 crawl() 方法爬取 URL 成功后返回的 Response 響應(yīng)。
@config(age=10 * 24 * 60 * 60)def parse_page(self, response):content = response.json["data"]doc = pq(content)lis = doc('.mod-art').items()data = [{'title': item('.msubstr-row2').text(),'url':'https://www.huxiu.com'+ str(item('.msubstr-row2').attr('href')),'name': item('.author-name').text(),'write_time':item('.time').text(),'comment':item('.icon-cmt+ em').text(),'favorites':item('.icon-fvr+ em').text(),'abstract':item('.mob-sub').text()} for item in lis ] return data最后,定義一個(gè) on_result() 方法,該方法專門用來(lái)獲取 return 的結(jié)果數(shù)據(jù)。這里用來(lái)接收上面 parse_page() 返回的 data 數(shù)據(jù),在該方法可以將數(shù)據(jù)保存到 MongoDB 中。
''' 遇到不懂的問(wèn)題?Python學(xué)習(xí)交流群:821460695滿足你的需求,資料都已經(jīng)上傳群文件,可以自行下載! '''# 頁(yè)面每次返回的數(shù)據(jù) def on_result(self,result):if result:self.save_to_mongo(result) # 存儲(chǔ)到mongo數(shù)據(jù)庫(kù)def save_to_mongo(self,result):df = pd.DataFrame(result) content = json.loads(df.T.to_json()).values()if collection.insert_many(content):print('存儲(chǔ)數(shù)據(jù)成功')# 暫停1stime.sleep(1)好的,保存代碼,修改每秒運(yùn)行次數(shù)和并發(fā)數(shù)
點(diǎn)擊run將代碼跑起來(lái),不過(guò)當(dāng)跑起來(lái)之后,就會(huì)發(fā)現(xiàn)抓取一個(gè)頁(yè)面之后程序就停止了, pyspider 以 URL的 MD5 值作為 唯一 ID 編號(hào),ID 編號(hào)相同,就視為同一個(gè)任務(wù), 不會(huì)再重復(fù)爬取。
GET 請(qǐng)求的分頁(yè)URL 一般不同,所以 ID 編號(hào)會(huì)不同,能夠爬取多頁(yè)。 POST 請(qǐng)求的URL是相同的,爬取第一頁(yè)之后,后面的頁(yè)數(shù)便不會(huì)再爬取。
解決辦法,需要重新寫下 ID 編號(hào)的生成方式,在 on_start() 方法前面添加下面代碼即可:
def get_taskid(self,task):return md5string(task['url']+json.dumps(task['fetch'].get('data','')))基本操作之后,文章入庫(kù)
總結(jié)
以上是生活随笔為你收集整理的分页请求json数据_pyspider抓取虎嗅网文章数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python把英语句子成分字母_英语句子
- 下一篇: ios 添加浮动效果_iOS实现拖拽Vi