python爬蟲第五天
阿新 • • 發佈:2019-01-29
nbsp onos cti 而在 鏈接 pan border cin exc
cookie
我們訪問網頁是通過http協議進行的,而http協議是一個無狀態協議(無法維持會話之間的狀態),比如我們登錄一個網站成功後訪問另一個網頁,那麽登錄狀態就會消失,十分不方便。而我們可以通過Cookie保存會話信息,將會話信息保存在客戶端,或者用session保存會話信息在服務器端。但是服務器端會給客戶端發送sessionID等信息,這些信息一般保存在Cookie中,大部分時候我們都要用到Cookie,而爬蟲中我們可以通過Cookie保持登錄狀態進行內容爬取。
Cookiejar實戰精析
註意:python3中使用Cookiejar庫進行處理,而在python2中可以使用Cookielib庫進行處理。
現在我們登錄ChinaUnix論壇,http://bbs.chinaunix.net
http://account.chinaunix.net/login/?url=http%3A%2F%2Fbbs.chinaunix.net%2F
我們先註冊一下,然後我們可以通過Fiddler工具進行分析,不過我們現在先使用F12調出調試界面,登錄輸入用戶名密碼,點擊登錄,觀察調試界面。在NetWork下找到登錄Request URL字段得到POST表單網址http://bbs.chinaunix.net/member.php?mod=logging&action=login&logsubmit=yes。(書中這樣寫的,但是現在網頁自動跳轉了,我沒找到。。直接用了書上的可以用。)
import urllib.request
import urllib.parse
import http.cookiejar
#這裏填寫登錄成功的url,這裏的loginhash是書上的。這裏用肯定不行,這裏得在登錄頁面拿到才行
url="http://bbs.chinaunix.net/member.php?mod=logging&action=login&logsubmit=yes&loginhash=L68q"
postdata=urllib.parse.urlencode({
#這裏填寫用戶名密碼,自己填自己的吧
"username":"yang",
"password":"1234567890"
}).encode(‘utf-8‘)
req=urllib.request.Request(url,postdata)
req.add_header(‘User-Agent‘,‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36‘)
#創建CookieJar對象
cjar=http.cookiejar.CookieJar()
#使用HTTPCookieProcessor創建cookie處理器,並以其為參數opener為參數
opener=urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
#將opener安裝為全局
urllib.request.install_opener(opener)
file=opener.open(req)
data=file.read()
file=open("D:/crawler/9.html","wb")
file.write(data)
file.close()
url2="http://bbs.chinaunix.net"
data2=urllib.request.urlopen(url2).read()
fhandle=open("D:/crawler/10.html","wb")
fhandle.write(data2)
fhandle.close()
這個代碼我還沒有弄成功,先放在這裏吧。
接下來開始手寫爬蟲實戰
圖片爬蟲實戰
首先我們先實現一個簡單的爬蟲,我們打開京東首頁www.jd.com
進入手機分類商品http://list.jd.com/list.html?cat=9987,653,655,我們點擊下一頁發現網址變了,
http://list.jd.com/list.html?cat=9987,653,655&page=2&sort=sort_rank_asc&trans=1&JL=6_0_0&ms=6#J_main
可以發現這裏是使用get方法請求的,如何自動爬取其他頁的情況呢?我們可以使用for循環每次循環後把page字段加1,即自動切換到下一頁,之後我們要獲取對應的圖片,使用正則表達式匹配源碼中的圖片的鏈接部分,然後通過urllib.request.urlretrieve()方法將對應的鏈接保存在本地。
我們要先過濾點信息走,我們右擊查看源代碼:我們要找到一個唯一的標識,並且包含要爬取得內容,以及盡量少的無關信息。這裏我們找到<div id = "plist">
這是開頭的部分,結尾的標識<div class="page clearfix"滿足要求
這樣過濾就是:用正則表達式只取這兩個標識中間的內容:patl=‘<div id="plist".+?<div class="page clearfix">‘
import re
import urllib.request
import urllib.error
def craw(url,page):
html1=urllib.request.urlopen(url).read()
html1=str(html1)
pat1=‘<div id="plist".+?<div class="page clearfix">‘
result1=re.compile(pat1).findall(html1)
result1=result1[0]
pat2=‘<img width="220" height="220" data-img="1" src="//(.+?\.jpg)">‘
imagelist=re.compile(pat2).findall(result1)
x=1
for imageurl in imagelist:
imagename="D://crawler/image/image"+str(page)+str(x)+".jpg"
imageurl="http://"+imageurl
try:
urllib.request.urlretrieve(imageurl,filename=imagename)
except urllib.error.URLError as e:
if hasattr(e,"code"):
x+=1
if hasattr(e,"reason"):
x+=1
x+=1
for i in range(1,15):
url="http://list.jd.com/list.html?cat=9987,653,655&page="+str(i)
craw(url,i)
這樣就爬取成功了,我親測可以。
今天實在是懶就寫這麽多了
此文是我在學習《精通Python網絡爬蟲》(韋瑋著)的總結,純手打。
python爬蟲第五天