1. 程式人生 > >python爬蟲實戰(關於工作中遇到的問題)

python爬蟲實戰(關於工作中遇到的問題)

主要是說一下大體的思路,在爬蟲網站的時候遇到樂一些困難,最後解決。
需要爬蟲的網站:http://www.jisilu.cn/

在這個網站中,需要對實時投資資料進行爬取,涉及到四個頁面分級A分級B母基金分級套利

主要是採集表格中的資料:
這裡寫圖片描述
但是四個頁面有一些不同,分級套利介面需要登陸之後,才可以檢視當前的資料,而且四個頁面的資料都是js動態加載出來的,在前面對於分級A、分級B、母基金頁面的時候,採用了python的spynner+pyqt4採集技術,BeautifulSoup解析所採集到的頁面資料,這裡還是主要說spynner技術採集頁面,在採集分級套利介面的時候,頁面返回資訊提示,當前介面需要登陸才能訪問到資料。
理所當然,我百度了網路上登陸所需要的程式碼和工具。網路抓包工具推薦使用Fiddler4工具。
這裡寫圖片描述


大家可以在左頁面獲取到url,右邊可以檢視post或者get資料,還有header頭資訊和獲取到的返回資料。
我當時在這邊主要碰到的問題是,我之前所採用的技術spynner是如何設定cookies的,我當時閱讀了spynner的原始碼,發現spynner中是存在設定cookies的方法:
原始碼:

    @property
    def cookiesjar(self):
        """Compat."""
        return self.manager.cookieJar()

    @property
    def cookiejar
(self):
"""Compat.""" return self.cookiesjar def get_cookies(self): """Return string containing the current cookies in Mozilla format.""" return self.cookiesjar.mozillaCookies() def set_cookies(self, string_cookies): """Set cookies from a string with Mozilla-format cookies."""
return self.cookiesjar.setMozillaCookies(string_cookies)

主要是set_cookies方法,傳入的值需要的格式沒有具體說明,一直都搞不明白,直到現在還是不清楚,應該傳入的格式,如果有知道的,希望能指點一下。

這個時候,使用urllib2實現了登陸,但是登陸完之後的js動態採集資料,urllib2是獲取不到的,用spynner+pyqt4是獲取的到js動態載入的資料,此時就產生了分歧,我當時的做法就是想把urllib2所獲取到的cookies設定進spynner中,這樣結合起來就可以實現登陸,獲取動態資料,但是由於spynner設定cookies的困難,使我陷入了進退兩難之間,也是這個想法讓我陷入的死衚衕。

說說我最後是如何採集到資料的,其實很簡單,最後在採集的時候已經實現了登陸,那麼就算是介面採用js動態載入,但是資料的獲取離不開url請求,介面只是負責資料的展現,我在觀察Fidder4中的連結,有一個連結是資料的獲取,然後我採用這個連結直接獲取資料來源,這樣就不用去獲取整個介面的頁面,然後解析。

附錄
spynner採集程式碼:

    import spynner
def get_web_a():
    url_a = "http://www.jisilu.cn/data/sfnew/#tlink_3"
    br_a = spynner.Browser()
    if br_a.load(url_a, load_timeout=30):
        print br_a.html
        soup = BeautifulSoup.BeautifulSoup(br_a.html)
        tags = soup.findAll('tr')
        print type(tags)
        for tag in tags:
            print tag

urllib2登陸程式碼採集程式碼:

url_login = "http://www.jisilu.cn/account/ajax/login_process/"
url_data = "http://www.jisilu.cn/data/sfnew/arbitrage_vip_list/"

_post_type = "ajax"
net_auto_login = "1"
user_name = ""
password = ""
return_url = "http://www.jisilu.cn/data/sfnew/"
login_params = {
    "user_name": user_name,
    "password": password,
    "return_url": return_url,
    "net_auto_login": net_auto_login,
    "_post_type": _post_type
}

headers = {
    "Referer": "http://www.jisilu.cn/login/",
    "Connection": "keep-alive",
    "Accept": "application/json, text/javascript, */*; q=0.01",
    "User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36"
}

cj = None
opener = None
req = None
response = None
operate = None


def get_cookielib():
    global cj, opener
    cj = cookielib.LWPCookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
    urllib2.install_opener(opener)


def login():
    global req, response, operate
    req = urllib2.Request(url_login, urllib.urlencode(login_params), headers=headers)
    response = urllib2.urlopen(req)
    operate = opener.open(req)
    thePage = response.read()
    print thePage
    import time
    timestamp = "%d" % (time.time() * 1000)
    req_data_params = {
        "___t": str(timestamp)
    }

    req = urllib2.Request(url_data, urllib.urlencode(req_data_params), headers=headers)
    response = urllib2.urlopen(req)
    perate = opener.open(req)
    thePage = response.read()
    print thePage # 所需要的資料