最近有个好友让我帮忙爬取个小说,这个小说是前三十章直接可读,后面章节需要充值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文件编码/默认字符转码
《完》