最近有个好友让我帮忙爬取个小说,这个小说是前三十章直接可读,后面章节需要充值VIP可见。所以就需要利用VIP账户登录后,构造Cookie,再用Python的获取每章节的url,得到内容后再使用 PyQuery 解析内容。

  注意:构造Cookie的过程中,需要你在 Chrome/Firefox 登录,然后自己在控制台查看 cookie,然后手动加入。

第一部分:手动构造cookie登录

 #version 2.7

 #!/usr/bin/python

 import HTMLParser
import urlparse
import urllib
import urllib2
import cookielib
import string
import re cj = cookielib.LWPCookieJar() def make_cookie(name, value):
return cookielib.Cookie(
version=0,
name=name,
value=value,
port=None,
port_specified=False,
domain="yourdomain",
domain_specified=True,
domain_initial_dot=False,
path="/",
path_specified=True,
secure=False,
expires=None,
discard=False,
comment=None,
comment_url=None,
rest=None
) cj.set_cookie(make_cookie("name", "value")) cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener) request = "http://vip.xxx.com/m/xxx.aspx?novelid=12&chapterid=100&page=1" response = urllib2.urlopen(request)
text = response.read()
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文件编码/默认字符转码

《完》

Python手动构造Cookie模拟登录后获取网站页面内容的更多相关文章

  1. C#程序模拟登录批量获取各种邮件内容信息

    一般来说,如果现实中你有这样一种需求“假如你是褥羊毛的羊毛党,你某日发现了一个app有一个活动,通过邮箱注册账号激活可以领5元红包,而恰恰你手上又有一批邮箱可用,那么批量获取邮箱中的激活链接去激活则是 ...

  2. 获取windows身份认证网站页面内容

    有些网站必须登录才能获取到页面内容. 代码如下,可获取数据. var url = "https://yunda-api-test.appspot.com/int/parcel?wait=tr ...

  3. Java通过httpclient获取cookie模拟登录

    package Step1; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.Htt ...

  4. Python3之利用Cookie模拟登录

    Python3之利用Cookie模拟登录 利用Cookie模拟登录步骤: 1.       在浏览器输入http://demo.bxcker.com,输入用户名和密码登录. 2.登录成功点" ...

  5. PHP cURL 使用cookie 模拟登录

    cURL是什么 cURL: http://php.net/manual/zh/book.curl.php PHP 支持 Daniel Stenberg 创建的 libcurl 库,能够连接通讯各种服务 ...

  6. PHP模拟登录并获取数据

    cURL 是一个功能强大的PHP库,使用PHP的cURL库可以简单和有效地抓取网页并采集内容,设置cookie完成模拟登录网页,curl提供了丰富的函数,开发者可以从PHP手册中获取更多关于cURL信 ...

  7. 《转载》python爬虫实践之模拟登录

    有些网站设置了权限,只有在登录了之后才能爬取网站的内容,如何模拟登录,目前的方法主要是利用浏览器cookie模拟登录.   浏览器访问服务器的过程   在用户访问网页时,不论是通过URL输入域名或IP ...

  8. Python 爬虫实战5 模拟登录淘宝并获取所有订单

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 本篇内容 python模拟登录淘宝网页 获取登录用户的所有订单详情 ...

  9. PHP获取Cookie模拟登录CURL

    要提取google搜索的部分数据,发现google对于软件抓取它的数据屏蔽的厉害,以前伪造下 USER-AGENT 就可以抓数据,但是现在却不行了.利用抓包数据发现,Google 判断了 cookie ...

随机推荐

  1. GitCam一款Gif动画制作软件

    本篇文章由:http://www.sollyu.com/gitcam-a-gif-animation-software/ 说明 GifCam是一款小巧.免费的录制电脑屏幕并制作成GIF动画的软件,具有 ...

  2. Java中printStackTrace()、toString()、getMessage()的区别

    一.三者之间的关系图: 二.演示 1.printStackTrace()演示: public class Test {     public int div(int a, int b)     {   ...

  3. SSH框架jar神包

    SSH JAR包链接(https://zhidao.baidu.com/share/ac8b1389bac84023d7442cad88f3933c.html)

  4. easy ui tabs 顶部绑定事件

    $(function(){     $('#tb').tabs('bindclick', function(index, title){     }); }); $.extend($.fn.tabs. ...

  5. HTML5中的Canvas

    1.Canvas标签的宽高一定要设置在标签上或者采用js添加属性,如果用css去设置的话,会把画布被拉伸,相当于将默认的画布拉伸到指定位置.默认为300px*100px; <canvas wid ...

  6. hbuider 中点击就显示出一个单选的列表 ,然后后台跨域向里面动态添加数据,注意里面的格式是json object

    jsp页面: <li class="mui-table-view-cell" onclick="showActionSheet()"> <di ...

  7. 刷新dns

    1.window:ipconfig /flushdns 2.linux sudo rcnscd restart

  8. An easy way to syncTime using C#

    /* * Created by SharpDevelop. * User: Administrator * Date: 2013/10/23 * Time: 8:57 * author zibet * ...

  9. Objective-C中的const ,extern,static

    一.const 1>对于const,记住关键的一点,它只是修饰右边的变量. 例如: - (void)viewDidLoad { [super viewDidLoad]; // const两种用法 ...

  10. 用Python和Django实现多用户博客系统(二)——UUBlog

    这次又更新了一大部分功能,这次以app的形式来开发. 增加博客分类功能:博客关注.推荐功能(ajax实现) 增加二级频道功能 更多功能看截图及源码,现在还不完善,大家先将就着看.如果大家有哪些功能觉的 ...