python爬虫源码附注解_Python小白写的三个入门级的爬虫(附代码和注释)
Python小白寫的三個入門級的爬蟲(附注釋)
寫在前面的話:作者目前正在學習Python,還是一名小白,所以注釋可以會有些不準確的地方,望諒解。
這三個小爬蟲不是很難,而且用處可能也不大,主要還是鍛煉新手對函數的運用與理解
大牛和意義黨可以先繞過了
附:我用的是Pyton2.713,用3.0的朋友運行可能會有些代碼出錯
第一個,網頁源代碼爬蟲;
#-- coding: utf-8 --
#一個巨詳細又簡單的小爬蟲
#---------------------------------
import string
from 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= 得自己加上去),效果如圖;
第三個,爬取內涵段子并寫入文本(這個對新手來講可能有點難理解和麻煩)
需要用到的工具:谷歌瀏覽器,火狐瀏覽器,和一顆堅持下去的心。
準備工作
1.用谷歌打開內涵段子官網,然后按F12進行抓包,如圖;
初始框在右邊,可以在Dock side那里調到下面,選擇Network,然后點All,如果左上角不是紅點,就點一下(是紅色就不用點)表示瀏覽器正對此頁面進行抓包。
再然后滑到最下面點擊加載更多;
此時查看抓到的內容,找到圖中的文件,并且復制Request URL 的鏈接地址,在火狐瀏覽器中打開,(之所以用火狐是因為火狐自帶轉碼,不然用谷歌打開可能會是亂碼);
在火狐瀏覽器中打開如圖;
然后點開可以發現,段子內容在 data>data>0>group>text路徑下;
還可以發現,不止有0,還有1,2,3,4,5....19,可以猜到這應該是頁數之類的。所以后面可以利用代碼來循環爬取更多的內容;
還需要突破反爬措施,其實很簡單,只需要將Request Headers下的內容復制放進代碼里就行了(不過要記得加''和:分開來,代碼部分有);
代碼部分
'''
Title = 爬取內涵段子寫入進文本
coder = 秦王IPC
date = 2018-01-30
因為使用while循環,所以需要手動停止,不然會一直寫入下去。
'''
import requests #網絡請求模塊
import time #時間模塊,下面要設置訪問間隔時間。如果不設置,服務器可能會認為你是惡意***,就會進行防護措施,如封IP什么的。
import sys
reload(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'])#返回時間戳
運行效果;
小白的第一篇博客,有錯誤或是不準確的地方可以在評論區里指出(注意用詞文明),謝謝!
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的python爬虫源码附注解_Python小白写的三个入门级的爬虫(附代码和注释)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python的类方法_python 如何
- 下一篇: python爬虫搜特定内容的论文_pyt