標籤:去掉 地址 工具 ade 瀏覽器 odi src .json 賦值
Python小白寫的三個入門級的爬蟲(附註釋)
寫在前面的話:作者目前正在學習Python,還是一名小白,所以注釋可以會有些不準確的地方,望諒解。這三個小爬蟲不是很難,而且用處可能也不大,主要還是鍛煉新手對函數的運用與理解大牛和意義黨可以先繞過了
附:我用的是Pyton2.713,用3.0的朋友運行可能會有些代碼出錯
第一個,網頁原始碼爬蟲;
#-- coding: utf-8 --#一個巨詳細又簡單的小爬蟲#---------------------------------import stringfrom urllib2 import urlopen #通過from import匯入urllib2庫中的urlopen模組,用於抓取url的內容url = raw_input(‘>‘) #使用raw_input函數讓使用者輸入想要爬取的網頁,並且賦值給變數x = urlopen(‘http://‘+url) #調用urlopen擷取源碼並賦值給變數 前邊加上http://是怕使用者忘記輸入http協議print x.read() #最後使用read函數查看並使用print列印出來
用Python內建的IDLE開啟,輸入www.baidu.com ,效果;
第二個,爬取並下載百度貼吧的內容;
#-- coding: utf-8 --#爬取並下載百度貼吧的html檔案#秦王IPC#------------------------------------------------import string #調用模組from urllib2 import urlopen #調用urllib2庫中的模組#---------------------------------#定義函數 def paqutieba(url,x,y): for j in range(x, y+1): #迴圈從開始頁面到終點頁面 Name = string.zfill(j,5) + ‘.html‘ #string.zfill(1,5) 檔案名稱效果00001. print ‘正在下載第‘ + str(j) + ‘個網頁內容,並將其儲存為‘ + Name + ‘......‘ #下載的時候列印 l = open(Name,‘w+‘) #將寫入操作賦值給變數l k = urlopen(url + str(j)).read() #調用urlopen模組抓取網頁內容並查看並賦值給變數k l.write(k) #將k內容寫入 l.close() #關閉#---------------------------------與使用者互動---------------url = str(raw_input(u‘請輸入貼吧的地址,去掉?pn=後面的數字:\n格式:https://tieba.baidu.com/p/xxxxxxxxx?pn= \n>>>‘)) x = int(raw_input(u‘請輸入開始的頁數:\n‘)) y = int(raw_input(u‘請輸入終點的頁數:\n‘)) paqutieba(url,x,y) #調用函數
用Python內建的IDLE開啟,隨意輸入一個貼吧地址 (有些URL沒有 ?pn= 得自己加上去),效果;
第三個,爬取內涵段子並寫入文本(這個對新手來講可能有點難理解和麻煩)
需要用到的工具:Google瀏覽器,Firefox瀏覽器,和一顆堅持下去的心。
準備工作
1.用Google開啟內涵段子官網,然後按F12進行抓包,;
初始框在右邊,可以在Dock side那裡調到下面,選擇Network,然後點All,如果左上方不是紅點,就點一下(是紅色就不用點)表示瀏覽器正對此頁面進行抓包。
再然後滑到最下面點擊載入更多;
此時查看抓到的內容,找到圖中的檔案,並且複製Request URL 的連結地址,在Firefox瀏覽器中開啟,(之所以用Firefox是因為Firefox內建轉碼,不然用Google開啟可能會是亂碼);
在Firefox瀏覽器中開啟;
然後點開可以發現,段子內容在 data>data>0>group>text路徑下;
還可以發現,不止有0,還有1,2,3,4,5....19,可以猜到這應該是頁數之類的。所以後面可以利用代碼來迴圈爬取更多的內容;
還需要突破反爬措施,其實很簡單,只需要將Request Headers下的內容複寫放進代碼裡就行了(不過要記得加‘‘和:分開來,代碼部分有);
代碼部分
‘‘‘Title = 爬取內涵段子寫入進文本coder = 秦王IPCdate = 2018-01-30因為使用while迴圈,所以需要手動停止,不然會一直寫入下去。‘‘‘import requests #網路請求模組import time #時間模組,下面要設定訪問間隔時間。如果不設定,伺服器可能會認為你是惡意攻擊,就會進行防護措施,如封IP什麼的。import sysreload(sys)sys.setdefaultencoding(‘utf-8‘)#這三行是轉碼header = {‘Host‘:‘neihanshequ.com‘, ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0‘, ‘Accept‘: ‘application/json, text/javascript, */*; q=0.01‘, ‘Accept-Language‘: ‘zh-CN,en-US;q=0.7,en;q=0.3‘, ‘Accept-Encoding‘: ‘gzip, deflate‘, ‘Referer‘: ‘http://neihanshequ.com/‘, ‘X-CSRFToken‘: ‘e9b62faa6a962cdf92f1531b498fc771‘, ‘X-Requested-With‘: ‘XMLHttpRequest‘, ‘Cookie‘: ‘csrftoken=e9b62faa6a962cdf92f1531b498fc771; tt_webid=6486401443292186126; uuid="w:c07f437659474cc1a7cfd052d9985b37"; Hm_lvt_3280fbe8d51d664ffc36594659b91638=1511848146,1512200937,1512371475,1514373568‘, ‘Connection‘: ‘keep-alive‘, ‘Pragma‘: ‘no-cache‘, ‘Cache-Control‘: ‘no-cache‘} #添加網頁的Request Headers資訊,偽裝成通過瀏覽器訪問,目的是為了突破反爬措施。timestamp = 1517361103 #設定並賦值起始時間戳記 --下面的while迴圈是利用時間戳記來判斷while type(timestamp) == int or type(timestamp) == float: #保證時間戳記不管是哪種類型的數值都能運行 url = ‘http://neihanshequ.com/joke/?is_json=1&app_name=neihanshequ_web&max_time=‘+str(timestamp) #用F12抓包然後點載入更多擷取原始連結 html = requests.get(url,headers=header)#使用get請求url內容,並賦值為html time.sleep(3) #設定間隔時間 for u in range(len(html.json()[‘data‘][‘data‘])):#print(len(html.json()[‘data‘][‘data‘]))判斷一頁有多少段子,放進for語句中就是有多少迴圈多少的意思 with open(r‘c:\duanzi.txt‘,‘a‘ ) as ipc: #使用with。設定寫入路徑 nr=html.json()[‘data‘][‘data‘][u][‘group‘][‘text‘] #html.json是檔案類型,方括弧裡面的是內容所在路徑 ipc.write(nr+‘\n‘) #進行寫入操作 timestamp = html.json()[‘data‘][‘max_time‘] #每當迴圈一次結束後,返回新的時間戳記進行下一次迴圈 #--------------------------可以加可不加--------------------- #print(html.status_code)#返回狀態代碼 #print(html.json()[‘data‘][‘max_time‘])#返回時間戳記
運行效果;
小白的第一篇部落格,有錯誤或是不準確的地方可以在評論區裡指出(注意用詞文明),謝謝!
Python小白寫的三個入門級的爬蟲(附代碼和注釋)