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手动构造Cookie模拟登录后获取网站页面内容_第1张图片

 

 

 

 

 

本节参考:百度知道,博客园: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文件编码/默认字符转码

 

《完》

你可能感兴趣的:(Python手动构造Cookie模拟登录后获取网站页面内容)