最近有個好友讓我幫忙爬取個小說,這個小說是前三十章直接可讀,后面章節需要充值VIP可見。所以就需要利用VIP賬戶登錄后,構造Cookie,再用Python的獲取每章節的url,得到內容后再使用 PyQuery 解析內容。
注意:構造Cookie的過程中,需要你在 Chrome/Firefox 登錄,然后自己在控制台查看 cookie,然后手動加入。
第一部分:手動構造cookie登錄
1 #version 2.7 2 3 #!/usr/bin/python 4 5 import HTMLParser 6 import urlparse 7 import urllib 8 import urllib2 9 import cookielib 10 import string 11 import re 12 13 cj = cookielib.LWPCookieJar() 14 15 def make_cookie(name, value): 16 return cookielib.Cookie( 17 version=0, 18 name=name, 19 value=value, 20 port=None, 21 port_specified=False, 22 domain="yourdomain", 23 domain_specified=True, 24 domain_initial_dot=False, 25 path="/", 26 path_specified=True, 27 secure=False, 28 expires=None, 29 discard=False, 30 comment=None, 31 comment_url=None, 32 rest=None 33 ) 34 35 cj.set_cookie(make_cookie("name", "value")) 36 37 38 cookie_support = urllib2.HTTPCookieProcessor(cj) 39 opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler) 40 urllib2.install_opener(opener) 41 42 43 request = "http://vip.xxx.com/m/xxx.aspx?novelid=12&chapterid=100&page=1" 44 45 response = urllib2.urlopen(request) 46 text = response.read() 47 print text
注意:修改22行的 domain,增加35行的 cookie 項, 修改43行的 你的要爬取頁面的地址,下面是Chrome下看登錄帳號的cookie。
本節參考:百度知道,博客園:python模擬登錄, 用Python模擬登錄網站。
第二部分:
本以為簡單,結果折騰了很久。原因是 Python 2.7 的默認編碼是 ASCII,導致 BS(Beautifule soup)的結果總是亂碼,其實也不是亂碼,明顯是漢字的 unicode 編碼。
python 2.7 內部默認編碼 sys.defaultencoding 是 ASCII。所以在 BS 解析出的結果出現漢字后,python 將自己無法理解的 漢字 使用 ASCII 格式進行編碼存儲,導致后面寫文件時總是出現 “TypeError: expected a character buffer object” 錯誤。代碼中將 BS 的結果使用 ASCII 解碼后,再編碼為utf-8 就解決了問題。當然還有其他辦法,可以看下面的參考鏈接。
注意:代碼文件首行的 #coding=utf-8 的作用只是本代碼文件的編碼格式設置為 utf-8(這樣就可以寫中文注釋),和上面講的編碼解碼不要混淆。
#coding=utf-8 #version 2.7 #!/usr/bin/python import HTMLParser import urlparse import urllib import urllib2 import cookielib import string import re#-------------- hosturl = 'http://login.zhizihuan.com/login/m' posturl = 'http://m.zhizihuan.com/' #...此處省略 page = response.read() #------------- #part two from bs4 import BeautifulSoup from bs4 import SoupStrainer #beautiful soup 可不用安裝,可直接下載該包導入項目即可,因為我是用完就扔掉代碼,不發布 #解析部分文檔 http://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/#id58 only_tags_with_id = SoupStrainer(id="htmlmain") #提取ID為htmlmain的標簽及子元素 novelCnt = BeautifulSoup(page, "html.parser", parse_only=only_tags_with_id).decode('ascii').encode('utf-8')#指定解析器和過濾 print novelCnt
第三部分:寫入本地文件
#part three file = open("/Users/ql/Documents/novel.txt",'a') file.write(novelCnt) file.flush(); file.close()
本節參考:Python文件編碼/默認字符轉碼
《完》