1. 程式人生 > >python 爬蟲1 開始,先拿新浪微博開始

python 爬蟲1 開始,先拿新浪微博開始

大括號 版本 install esp con data- 定位 ble Language

剛剛開始學。

目的地是兩個。一個微博,一個貼吧

存入的話,臨時還沒想那麽多。先存到本地目錄吧

分詞和推薦後面在整合

mysql mongodb hadoop redius 後面在用


我最終知道為什麽大家都推薦用python寫爬蟲了。。。我擦。一些開源的包實在寫的太好了

我開始I還百思不得其解的為什麽要用python這種語言。我真的用起來非常”蛋疼“

並且。我用這門語言真的像我當初用c語言一樣的用的。純粹的用面向過程的思想寫。

一點一點墨跡。。

。盡管我知道他有面向對象的特性。。

可是怎麽都認為不能習慣,不要說和C# .net 來比

我認為和java 的風格也相差非常大啊。並且即使比c或者matlab 盡管編碼非常快。可是keyword和執行調試機制還不是非常熟悉。

。。

你懂的。我非常痛苦

直到我調試模擬認證……做過的人肯定會有經驗。我之前工作用.net 做過爬蟲(當時也就有個概念),

後來在學習過程裏又用java 寫過爬蟲。爬阿裏速賣通。結果失敗了(我如今明確當時為什麽我失敗了。我當時都已經拿到Outh的ssid了

這個ssid 是 驗證用戶password正確後發回的授權代碼,僅僅要有這個全局就不用認證。但是就是跳不到指定的頁面。我如今認為肯定是自己主動跳轉location

搞鬼,當然可能還有cookie的原因)可是在python包裏完美攻克了這兩個問題,全然不用你操心。

所有的cookie從第一個頁面到最後目的頁面所有接住了

所有寫到文件,並且,最重要的是從請求登陸到指定主頁之間的授權跳轉request(不過head頭之間的跳轉,全然沒有頁面)全然被自己主動化處理了

就像瀏覽器自己處理一樣,這讓我非常是大喜啊。省了非常多中間頁面模擬的麻煩啊!

。!

!!

!!。!!!

!!

!!

!!!!


ubuntu14.04 python 自帶,

安裝了一個beautifulsoup 的 解析器 ,這裏我裝的是新版本號。不是apt-get自帶的版本號

#安裝版本號4
apt-get install python-bs4 python-bs4-doc


技術分享


開始

import cookielib
import os
import re
import urllib
import urllib2
import math

auth_url = ‘http://www.weibo.cn‘
home_url = ‘http://www.weibo.cn‘;
filename=‘FileCookieJar.txt‘

#正則表達式一定要從小往大了寫,先配對好配對的部分,先配對特征突出的部分,在往大了寫,不然根本寫不出來

#[\u4E00-\u9FA5] 這個表示中國字。 之前是沒有加一對小括號的。加上表示取出group,在模式串前面寫上u 表示unicode 編碼的意思?

技術分享

#之前的大部分樣例都是寫上個r

reg=u"<a href=(‘http://login.weibo.cn/[^\u4E00-\u9FA5]*?)[>]+?

[\u4E00-\u9FA5]{2}</a>"
pattern=re.compile(reg)

req = urllib2.Request(home_url)
req.add_header(‘User-Agent‘, ‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)‘)

#這一步是把cookies 寫入對應的文件

ckjar = cookielib.MozillaCookieJar(filename)
ckproc = urllib2.HTTPCookieProcessor(ckjar)

opener = urllib2.build_opener(ckproc)

f = opener.open(req)

#把吃下來的網頁寫成utf-8 的格式
htm = f.read().decode(‘utf-8‘)
f.close()
ckjar.save(ignore_discard=True, ignore_expires=True)
print htm

#假設要用group 就不能寫findall,要用search 或者寫finditer 這兩個返回的都是match 對象,後面的返回的應該是match列表

#findall 返回的是列表不是match列表 ,finditer 返回的結果能夠用 遍歷 for match in result : print match.group(1)
loginweb=pattern.search(htm).group(1)
print loginweb

#表示從第二個取到倒數第二個,去掉模式串中兩頭的單引號
loginweb=loginweb[1:-1]
print loginweb
params=loginweb.split(‘;‘)
for param in params:
print param

wl=WeiboLogin(loginweb,"","")
wl.getweibologin()

這裏補充一下:文件頭一定要加:

#!/usr/bin/env python
#_*_ coding: utf-8_*_

不然中文的凝視都會報錯


接著用上了面向對象的思想

新建了一個類,這也是痛苦的作死過程,可是好歹最後學到了東西

#類會先運行這個函數。構造函數初始化,這個能夠自己改,能夠重載

def __init__(self, urlse,user, pwd):
self.url=urlse


#定義拿到登陸頁面的方法。想拿到第一步cookie

def getweibologin(self):
filename=‘FileCookieJar.txt‘
ckjar = cookielib.MozillaCookieJar(filename)
print self.url
req = urllib2.Request(self.url)
req.add_header(‘User-Agent‘, ‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)‘)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(ckjar) )
f = opener.open(req)
htm = f.read().decode(‘utf-8‘)
f.close()
ckjar.save(ignore_discard=True, ignore_expires=True)
self.loginweb1(htm)

#模擬登陸的方法

def loginweb1(self,sweb):
soup=BeautifulSoup(sweb)
##這裏要用find不用findAll,因findall 拿到的是一系列標簽的list

#而且後面大括號表示篩選條件,中括號表示取出標簽相應的值
resp1 = soup.find(‘input‘, attrs = {‘name‘:‘vk‘})[‘value‘]
resp2=soup.find(‘input‘,attrs={‘name‘:‘backURL‘})[‘value‘]
flag=resp1.split(‘_‘)[0] #python 從零開始
passwordflag="password_"+flag
print passwordflag
filename=‘FileCookieJar.txt‘
ckjar = cookielib.MozillaCookieJar(filename)
rand=random.randint(500000000, 999999999)#生成隨機數的方法

#這裏也要註意。fiddler的頁面請求沒有主域名。這裏我是把域名拼接起來的。這個真沒辦法。

還有type 的控制,就是頁面請求前面帶上的http://

#至於是post傳值還是get傳值,這個包沒有規定,假設data 有值就是post方法,假設沒有值,那就是get 。可是get方法的請求連接一定要自己拼接好或者繼承好

#這個就是精華地方。他從登陸到得到主頁面 就這麽一個步驟,中間的location的跳轉過程所有自己主動完畢,自己主動跳轉。

參數cookie所有繼承,方便,又不會出錯

#這樣就完畢了登陸過程,就能夠找到人物關系,能夠後面的步驟了

技術分享
surl="http://login.weibo.cn/login/?rand="+str(rand)+"&backURL=http%3A%2F%2Fweibo.cn%2F&backTitle=%E5%BE%AE%E5%8D%9A&vt=4&revalid=2&ns=1"
print surl
req = urllib2.Request(surl)
req.add_header(‘Accept‘,‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘)
#req.add_header(‘Accept-Encoding‘,‘gzip, deflate‘) #之所以要凝視掉它。是由於加上後,會影響後面的解析,壓縮後的頁面解析會出問題。幹脆不要壓縮
req.add_header(‘Accept-Language‘,‘zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3‘)
req.add_header(‘User-Agent‘, ‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)‘)

req.add_header(‘Referer‘,‘http://login.weibo.cn/login/?

ns=1&revalid=2&backURL=http%3A%2F%2Fweibo.cn%2F&backTitle=%CE%A2%B2%A9&vt=‘)
postdata=urllib.urlencode({
‘mobile‘:‘賬戶‘,#這裏換成你的賬戶
passwordflag:‘password‘,##這裏換成你的password
‘remember‘:‘on‘,
‘backURL‘ : ‘http%3A%2F%2Fweibo.cn%2F‘,
‘backTitle‘ : ‘微博‘,
‘tryCount‘ :‘‘,
‘vk‘ : resp1,
‘submit‘ : ‘登錄‘
})
req.add_data(postdata)
#req.add_header(‘host‘, ‘login.weibo.cn‘)#拼接域名的話就不必要填這兩個了
#req.host=‘login.weibo.cn‘
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(ckjar) )
f = opener.open(req)
htm = f.read().decode(‘utf-8‘)
print htm
f.close()
ckjar.save(ignore_discard=True, ignore_expires=True)
self.findweibo(htm)

#解析定位到自己的微博

def findweibo(self,sweb):
soup=BeautifulSoup(sweb)
c=soup.find(‘div‘, attrs = {‘class‘:‘tip2‘})
print c
aim=BeautifulSoup(str(c))
ax=aim.findAll(‘a‘)[0][‘href‘]
print ax

#這裏還補充一個調試技巧。由於分開類來寫了。假設從頭開始調試要非常長步驟時間,並且重復登陸或者搜集同一個頁面會被覺得蜘蛛盜鏈

#所以在py 文件中 不是class裏 和class 同級別縮進增加

if __name__ == ‘__main__‘:

#寫入調用方法的邏輯

用類名().詳細方法(參數列表); #相當於實例化對象,然後調用裏面方法,然後就能夠直接跳到方法裏去調試了


明天繼續研究怎樣抽取微博數據。愛好社區和人物關系數據


補充fiddler 監測瀏覽器的時候,google chrome 會有問題,監測不了,不知道是不是代理的問題。。

。不願意深究了

我用的火狐瀏覽器測試是實用能夠監測的。

爬蟲模擬的時候用的也是火狐header。

假設你暫停了一下。在繼續監測可能就監測不了了,僅僅能重開火狐才又恢復,不知道什麽原因。





python 爬蟲1 開始,先拿新浪微博開始