python requests 爬取騰訊科技的新聞
阿新 • • 發佈:2018-12-18
昨天收到一道面試題爬取http://tech.qq.com/articleList/rolls/的新聞,當時看到的時候簡直簡單爆了,事實證明的確是,將將將,就是這個頁面,很普通啊,開幹。。。
1.首先發現在檢視原始碼的時候看不見這些資料,所以需要js抓一下,注意到url的最後一個引數是個時間戳,然後就是headers裡一定要放上referer,不然獲取不到的(就因為這個referer,讓我手足無措的找了半個小時哪的問題,所以說一定要細心)
2.requests.get(url),獲取一下內容,你就會神奇的發現,已經爬下來了,嚶嚶嚶~
now=int(time.time()*1000) # 新聞獲取的介面,其中page可以切換1,2頁,now可以切換時間 url="http://roll.news.qq.com/interface/cpcroll.php?callback=rollback&site=tech&mode=1&cata=&date=2018-10-31&page=1&_=%s"%now headers={ 'Connection': 'keep - alive', 'User-Agent': 'Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', 'Referer': 'http://tech.qq.com/articleList/rolls/' } response=requests.get(url,headers=headers) text=response.text.strip() print(text)
3.因為獲取到的值不是,dict或者是json的樣子,所以做一個正則提取出json,然後eval轉成dict,然後就可以搞事情了
pattern = re.compile(r'.*rollback\((.*)\)') m = pattern.match(text) if m : string=m.group(1) dict=eval(string) for each in dict['data']['article_info']: title=each['title'] url=each['url'].replace("\\","") time_tech=each['time'] img=each['img'] desc=each['desc']
4.儲存成csv,因為本來打算存資料庫的,後來想想還是直接存成檔案吧,省事,還有就是不知道我的open(file,“a+”)不能讀,可能是直接到最後一行了?所以我就在不存在的時候建立一個,存在就open(file,“r+”), html_word(url)只是一個爬取具體新聞頁的東西的函式,如果需要可以豐富一下,所以直接上完整程式碼
#coding=utf-8 import requests import time import re import csv import os # 爬取新聞頁內容,只是儲存了整個的內容 def html_word(url): response=requests.get(url) text=response.text.encode('utf-8') return text now=int(time.time()*1000) # 新聞獲取的介面,其中page可以切換1,2頁,now可以切換時間 url="http://roll.news.qq.com/interface/cpcroll.php?callback=rollback&site=tech&mode=1&cata=&date=2018-10-31&page=1&_=%s"%now headers={ 'Connection': 'keep - alive', 'User-Agent': 'Mozilla/5.0 (Android 4.4; Mobile; rv:41.0) Gecko/41.0 Firefox/41.0', 'Referer': 'http://tech.qq.com/articleList/rolls/' } response=requests.get(url,headers=headers) text=response.text.strip() print(text) pattern = re.compile(r'.*rollback\((.*)\)') m = pattern.match(text) if m : string=m.group(1) dict=eval(string) for each in dict['data']['article_info']: title=each['title'] url=each['url'].replace("\\","") time_tech=each['time'] img=each['img'] desc=each['desc'] # 存放到csv檔案中 filename='Stu_csv.csv' if not os.path.exists(filename): course = open(filename,'w',encoding='utf8') course.close() with open(filename,"r+") as csvfile: reader = csv.reader(csvfile) column = (row[1] for row in reader if row) if url in column: print("我存在了") continue else: word=html_word(url) csv_write = csv.writer(csvfile, dialect='excel') # 寫入具體內容 csv_write.writerow((title,url,time_tech,img,desc,word)) print("我執行了一次")
ok,有什麼問題可以隨時問哦