Python手動構造Cookie模擬登錄后獲取網站頁面內容


  最近有個好友讓我幫忙爬取個小說,這個小說是前三十章直接可讀,后面章節需要充值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文件編碼/默認字符轉碼

 

《完》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM