1. 程式人生 > >python requests 爬取騰訊科技的新聞

python requests 爬取騰訊科技的新聞

昨天收到一道面試題爬取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,有什麼問題可以隨時問哦