zoukankan      html  css  js  c++  java
  • 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文件编码/默认字符转码

    《完》

  • 相关阅读:
    hud 1397
    hdu 1211
    hdu 1124
    hdu 1104
    1788
    hdu 1796
    sdut 2169
    hdu 1019
    $http post 取不到数据
    sql
  • 原文地址:https://www.cnblogs.com/muyun/p/5135720.html
Copyright © 2011-2022 走看看