上節講了理論,這節我們練習一下。
我們寫個簡單的看看,方面理解。
#!/usr/bin/python
#-*-coding:utf-8-*-
### @file 爬蟲.py
# @brief
# @author songqiang
# @version 1.0
# @date 2019-01-10
import urllib2
#向指定的url位址傳送請求,並返回伺服器響應的類檔案物件
response=urllib2.urlopen("")
#伺服器返回的類檔案物件支援python檔案物件的基本操作
#read()方法就是讀取檔案裡的全部內容,返回字串
html=response.read()
分析報頭:
user-agent: python-urllib/2.7直接用urllib2(user-agent: python-urllib/2.7)給乙個**傳送請求的話,確實略有些唐突了,就好比,人家每家都有門,你以乙個路人的身份直接闖進去顯然不是很禮貌。而且有一些站點不喜歡被程式(非人為訪問)訪問,有可能會拒絕你的訪問請求。
瀏覽器 就是網際網路世界上公認被允許的身份,如果我們希望我們的爬蟲程式更像乙個真實使用者,那我們第一步,就是需要偽裝成乙個被公認的瀏覽器。用不同的瀏覽器在傳送請求的時候,會有不同的user-agent頭。 urllib2預設的user-agent頭為:python-urllib/x.y
(x和y是python主版本和次版本號,例如 python-urllib/2.7)。
get方式獲取伺服器資料 (爬取貼吧頁面資料)
#!/usr/bin/python
# -*-coding:utf-8-*-
### @file 貼吧spider.py
# @brief
# @author songqiang
# @version 1.0
# @date 2019-01-12
import urllib #負責url編碼處理
import urllib2
def tiebaspider(url,beginpage,endpage):
"""作用:負責處理url,分配每個url去傳送請求
url:需要處理的第乙個url
beginpage: 爬蟲執行的起始頁面
endpage: 爬蟲執行的截止頁面
"""for page in range(beginpage,endpage+1):
pn=(page-1)*50
filename="第"+str(page)+"頁.html"
#組合為完整的url 並且pn直每次增加50
fullurl=url+"&pn="+str(pn)
#呼叫loadpage()傳送獲取html頁面
html=loadpage(fullurl,filename)
writefile(html,filename)
def loadpage(url, filename):
'''作用:根據url傳送請求,獲取伺服器響應檔案
filename: 檔名
'''headers =
request = urllib2.request(url, headers = headers)
response = urllib2.urlopen(request)
return response.read()
def writefile(html,filename):
print "正在儲存"+filename
with open(filename,'w') as f:
f.write(html)
print "-"*20
#模擬main函式
if __name__=="__main__":
kw=raw_input('請輸入需要爬取的貼吧:')
#輸入起始頁和終止頁 str轉為int型別
beginpage=int(raw_input("請輸入起始頁"))
endpage=int(raw_input("請輸入終止頁"))
url = ""
key = urllib.urlencode()
#組合後url示例 kw=lol
url=url+key
tiebaspider(url,beginpage,endpage)
例項2中用了urllib,它跟urllib2不太一樣,兩個最顯著的不同如下:
post請求:
在看《精通python網路爬蟲》這本書中,韋老師提供了乙個測試**
#!/usr/bin/env python
#-*- coding:utf8 -*-
### @file post請求
# @brief
# @author songqiang
# @version 1.0
# @date 2019-01-12
import urllib
import urllib2
#通過抓包的方式獲取url 並不是瀏覽器的url
url=""
#完整的headers
headers=
# 傳送到web伺服器的表單資料
formdata =
# 經過urlencode轉碼
data = urllib.urlencode(formdata)
# 如果request()方法裡的data引數有值,那麼這個請求就是post
# 如果沒有,就是get
request = urllib2.request(url, data = data, headers = headers)
html=urllib2.urlopen(request).read()
print "正在儲存"
with open("post.html","w") as f:
f.write(html)
print "-"*20
獲取ajax載入的內容
有些網頁內容使用ajax載入,只要記得,ajax一般返回的是json,直接對ajax位址進行post或get,就返回json資料了。
#!/usr/bin/env python
#-*- coding:utf8 -*-
### @file urllib_ajax.py
# @brief
# @author songqiang
# @version 1.0
# @date 2019-01-13
import urllib
import urllib2
url=""
headers=
# 變動的是這兩個引數,從start開始往後顯示limit個
formdata =
data = urllib.urlencode(formdata)
request = urllib2.request(url, data = data, headers = headers)
response = urllib2.urlopen(request)
print response.read()
每日學點python之四 切片
切片是指對操作的物件擷取其中一部分的操作。字串 列表 元組都支援切片操作。切片的語法 起始 結束 步長 注意 選取的區間屬於左閉右開型,即從 起始 位開始,到 結束 位的前一位結束 不包含結束位本身 我們以字串為例講解。如果取出一部分,則可以在中括號中,使用 name abcdef print na...
每日學點python之一
不管學什麼語言,我們首先要了解每種語言的發展歷史和應用前景。今天也是我學習python的第一天,我們來看看python的由來。關鍵點常識 執行速度,有速度要求的話,用c 改寫關鍵部分吧。國內市場較小 國內以python來做主要開發的,目前只有一些web2.0公司 但時間推移,目前很多國內軟體公司,尤...
每日學點python之七(名片管理系統)
file 名片管理系統 brief author songqiang version 1.0 date 2018 12 21 coding utf 8 用來儲存名片 card infors while true 1.列印功能提示 print 50 print 名片管理系統 v1.0 n print ...