Python抓取需要cookie的网页

Python抓取需要cookie的网页


在仿照《Python小练习:可视化人人好友关系》一文时,需要登录模拟登录人人网。然而自从CSDN事件之后,人人网开始使用加密方式处理登录名和密码,直接使用post方式已经无法登陆人人网。这时,从豆瓣讨论中找到了解决方法:

1. 首先使用浏览器登陆人人,然后找到浏览器中关于登陆的Cookie;
2.
将Cookie记录下来,在Python中使用cookie模块模拟浏览器的行为;
3. 取得并解析数据。

1. HTTP协议与Cookie

抓取网页的过程跟浏览器浏览网页的过程是一样的,了解浏览器的工作原理就进行网页抓取的第一步。
了解HTTP协议和Cookie的有一系列非常好的文章:

* HTTP协议详解
* HTTP协议 (二) 基本认证
* HTTP协议 (七) Cookie

想要使用Python模拟浏览器的登陆,需要使用它自带的两个模块urllib2和cookie,了解urllib2和cookie的使用可以参考:
*
HOWTO
Fetch Internet Resources Using urllib2

* cookielib and ClientCookie:Handling Cookies in Python
*
Dive Into Python:Chapter 11

2. urllib2与cookie使用分析

2.1. 最简单用法

1     import urllib2
2 page = urllib2.urlopen("http://www.baidu.com")
3 page_data = page.read()
4 print page_data

它直接模拟了登陆百度首页的方法,打印出来的话你可以看到page_data的内容和浏览器里查看到的网页源码是一样的。

2.2. 设置Request信息

有些网页不希望被抓取,这些网页所在的服务器可以通过Request的Header信息识别你使用的哪种浏览器访问的。比如大家在论坛常见的这样的图片就是这一种原理。

因此我们需要手修改Request的信息,urllib2提供了这一功能。
例:未更改Request

1     import urllib2
2 request = urllib2.Request("http://www.baidu.com")
3 opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1))#为了开启回显,需要手动构造一个HTTPHandler
4 feeddata = opener.open(request).read()

可以得到回显:


 1     send:‘GET / HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: www.baidu.com\r\nConnection: close\r\nUser-Agent: Python-urllib/2.7\r\n\r\n‘
2 reply:‘HTTP/1.1 200 OK\r\n‘
3 header:Date:Tue,25Mar201411:02:30 GMT
4 header:Content-Type: text/html
5 header:Transfer-Encoding: chunked
6 header:Connection:Close
7 header:Vary:Accept-Encoding
8 header:Set-Cookie: BAIDUID=A12BBEA0BBB616F70334E89B4BB19228:FG=1; expires=Thu,31-Dec-3723:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
9 header:Set-Cookie: BDSVRTM=0; path=/
10 header:Set-Cookie: H_PS_PSSID=5610_5631_1428_5224_5723_4261_5567_4759; path=/; domain=.baidu.com
11 header: P3P: CP=" OTI DSP COR IVA OUR IND COM "
12 header:Expires:Tue,25Mar201411:02:20 GMT
13 header:Cache-Control: private
14 header:Server: BWS/1.1
15 header: BDPAGETYPE:1
16 header: BDQID:0xcd6b513700008d44
17 header: BDUSERID:0

其中 send: ‘GET / HTTP/1.1\r\nAccept-Encoding:
identity\r\nHost: www.baidu.com\r\nConnection: close\r\nUser-Agent:
Python-urllib/2.7\r\n\r\n 就是urllib2库发送的Request
Header。服务器可以通过User-Agent分辨出是哪种浏览器浏览的网页。
例:手工设置Request
Header:


1     import urllib2
2 request = urllib2.Request("http://www.baidu.com")
3 opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1))#为了开启回显,需要手动构造一个HTTPHandler
4 user_agent ="Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 BIDUBrowser/6.x Safari/537.31"
5 request.add_header("User-Agent", user_agent)
6 feeddata = opener.open(request).read()

得到的回显‘ send: ‘GET / HTTP/1.1\r\nAccept-Encoding:
identity\r\nHost: www.baidu.com\r\nConnection: close\r\nUser-Agent: Mozilla/5.0
(Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43
BIDUBrowser/6.x
Safari/537.31\r\n\r\n 此时服务器会认为我们在使用其它的浏览器浏览网页。

2.3. 使用cookie

使用浏览器登陆一个以前已经登陆过的网页,往往不再需要输入用户名和密码再次登陆,这颗因为浏览器已经保存了网站发送来的cookie。下次登陆时,浏览器会自动发送相关cookie到服务器,确定目前登陆状态。因此如果能够取得一个网站的cookie,就可以不输入用户名和密码模拟登陆这个网站。

Python需要使用cookielib处理cookie。

在登陆一个网页之后,可以使用Firebug或Chrome的“开发人员工具”查看网页的cookie。


 1     import urllib2
2 import cookielib
3 request = urllib2.Request("http://www.renren.com")
4 cookie = cookielib.CookieJar()
5 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
6 opener.handle_open["http"][0].set_http_debuglevel(1)#设定开启回显
7 user_agent ="Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 BIDUBrowser/6.x Safari/537.31"
8 request.add_header("User-Agent", user_agent)
9 cookie ="t=*************************"#设定cookie的内容
10 request.add_header("Cookie", cookie)
11 feeddata = opener.open(request).read()

此时就可以模拟登陆人人网。

时间: 2024-11-08 08:40:11

Python抓取需要cookie的网页的相关文章

python抓取网页

一 不需要登录的 import urllib2 content = urllib2.urlopen('http://XXXX').read() 二 使用代理 import urllib2 proxy_support = urllib2.ProxyHandler({'http':'http://XX.XX.XX.XX:XXXX'}) opener = urllib2.build_opener(proxy_support, urllib2.HTTPHandler) urllib2.install_o

Python抓取网页&批量下载文件方法初探(正则表达式+BeautifulSoup) (转)

Python抓取网页&批量下载文件方法初探(正则表达式+BeautifulSoup) 最近两周都在学习Python抓取网页方法,任务是批量下载网站上的文件.对于一个刚刚入门python的人来说,在很多细节上都有需要注意的地方,以下就分享一下我在初学python过程中遇到的问题及解决方法. 一.用Python抓取网页 基本方法: [python] view plaincopyprint? import urllib2,urllib url = 'http://www.baidu.com' req 

python抓取百度彩票的双色球数据

最近在学习<机器学习实战>这本书,在学习的过程中不免要自己去实践,写些练习.这写练习的第一步就需要收集数据,所以为了写好自己的练习程序,我得先学会收集一些网络数据.了解到用python抓取网页数据的一些方法后,我就根据别人的demo,自己实践了一下,学着从百度彩票网站上抓取双色球的历史数据.以下我就介绍一下自己的小程序. 大致思路如下 找到相关url和其参数 找出页面上你要抓取的数据的位置,也就是说这个数据在那些标签下 将每页中学要的数据取下来按一定格式存放在自己本地 需要的环境: pytho

用Python抓取全站中的404错误

链接是SEO的一个重要因素.为了在搜索引擎中获取更好的排名,一定要定期检查下网站中的链接是否依然有效.特别是由于一些巨大的改动可能会导致坏链接的出现.要检测这些站内的链接问题,可以通过一些在线的工具.比如Google Analytics,Bing Webmaster Tools,brokenlinkcheck.com等.尽管有现成的工具,我们也可以自己来编写一个.使用Python会非常容易. 参考原文:How to Check Broken Links with 404 Error in Pyt

[python]乱码:python抓取脚本

参考: http://www.zhxl.me/1409.html 使用 python urllib2 抓取网页时出现乱码的解决方案 发表回复 这里记录的是一个门外汉解决使用 urllib2 抓取网页时遇到乱码.崩溃.求助.解决和涨经验的过程.这类问题,事后看来只是个极小极小的坑,不过竟然花去很多时间,也值得记录一下.过程如下: 目标: 抓取 http://sports.sina.com.cn/g/premierleague/index.shtml 代码: 1 2 3 4 5 6 # coding

房东要给我涨800房租,生气的我用Python抓取帝都几万套房源信息,我主动涨了1000。

老猫我在南五环租了一个80平两居室,租房合同马上到期,房东打电话问续租的事,想要加房租:我想现在国家正在也在抑制房价,房子价格没怎么涨,房租应该也不会涨,于是霸气拒绝了,以下是聊天记录:确认不续租之后,两三年没找过房的我上网搜索租房,没想到出来一坨自如,蛋壳,贝壳等中介网站:进去看看,各种房照非常漂亮,但是一看房租,想送给自己一首<凉凉>:附近房租居然比我当前房租高1000多RMB:自我安慰下,这些网站房源价格不是真实的,于是切换到我爱我家,链家等大中介平台,结果发现房租价格都差不多:心想这才

微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”

微信:一个提供即时通讯服务的应用程序,更是一种生活方式,超过数十亿的使用者,越来越多的人选择使用它来沟通交流. 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友的动态,而朋友圈中或虚或实的状态更新,似乎都在证明自己的"有趣",寻找那份或有或无的存在感. 有人选择在朋友圈记录生活的点滴,有人选择在朋友圈展示自己的观点.有时我们想去展示自己,有时又想去窥探着别人的生活,而有时又不想别人过多的了解自己的生活,或是屏蔽对方,或是不给对方看朋友圈,又或是不

Python抓取页面乱码问题的解决

import urllib2 response=urllib2.urlopen('http://house.focus.cn/') html=response.read() print html.decode('gbk') Python抓取页面乱码问题的解决,布布扣,bubuko.com

使用python抓取CSDN关注人的所有发布的文章

# -*- coding: utf-8 -*- """ @author: jiangfuqiang """ import re import urllib2 import cookielib import time def startParser(author,page=1): reg = r'<a href="/\w+/article/details/\d+">\s*\t*\n*\s*\t*\s*.*?\t*\n