您的位置:首页 > 编程语言 > Python开发

可登陆爬虫Python实现

2016-03-18 10:28 465 查看
最近期末测试完结了,正好恰逢周末,就想找点事来做,之前做过爬虫,遇到了登录的问题,今天就来整理下。登录问题其实就是程序发送请求,服务器返回数据时,发出http响应消息报文,这两种类型的消息都是由一个起始行,而cookie就在在http请求和http响应的头信息中,在请求中添加用户信息的cookie即可实现登录。于是乎cookie是消息头的一种很重要的属性。

什么是Cookie?

当用户通过浏览器首次访问一个域名时,访问的WEB服务器会给客户端发送数据,以保持WEB服务器与客户端之间的状态保持,这些数据就是Cookie,它是 Internet 站点创建的 ,为了辨别用户身份而储存在用户本地终端上的数据,Cookie中的信息一般都是经过加密的,Cookie存在缓存中或者硬盘中,在硬盘中的是一些小文本文件,当你访问该网站时,就会读取对应网站的Cookie信息,Cookie有效地提升了我们的上网体验。一般而言,一旦将 Cookie 保存在计算机上,则只有创建该 Cookie 的网站才能读取它。
Cookie的种类[/b]

会话Cookie(Session Cookie):这个类型的cookie只在会话期间内有效,保存在浏览器的缓存之中,用户访问网站时,会话Cookie被创建,当关闭浏览器的时候,它会被浏览器删除。 持久Cookie(Persistent Cookie): 这个类型的cookie长期在用户会话中生效。当你设置cookie的属性Max-Age为1个月的话,那么在这个月里每个相关URL的http请求中都会带有这个cookie。所以它可以记录很多用户初始化或自定义化的信息,比如什么时候第一次登录及弱登录态等。 Secure cookie:安全cookie是在https访问下的cookie形态,以确保cookie在从客户端传递到Server的过程中始终加密的。HttpOnlyCookie :这个类型的cookie只能在http(https)请求上传递,对客户端脚本语言无效,从而有效避免了跨站攻击。 第三方cookie: 第一方cookie是当前访问的域名或子域名下的生成的Cookie。 第三方cookie:第三方cookie是第三方域名创建的Cookie。
python模拟登录[/b][/b]首先查看所要爬取网站登录源码:(豆瓣为例)

看了这些之后,我们只用按照登录网址所需信息添加到post中就行。添加所需的包。
12345[code]import
requests
import
re
from
bs4
import
BeautifulSoup
import
random
import
urllib,urllib2
[/code]信息添加到post中
1234567891011[code]login_url
=
"https://accounts.douban.com/login"
headers
=
{
'User-Agent'
:'Mozilla
/
5.0
(Windows NT
6.1
; WOW64)\
AppleWebKit
/
537.36
(KHTML,like Gecko) Chrome
/
41.0
.
2272.118
Safari
/
537.36
',}
my_post
=
{
'redir'
:
'http://www.douban.com/doumail'
,
'form_email'
:
'*@qq.com'
,
'form_password'
:
'password'
,
'login'
:
'登录'
,
}
r
=
requests.post(login_url,data
=
my_post,headers
=
headers)
html
=
r.text
[/code]因为豆瓣登录需要验证码,但是本人并没有做过图像中验证码识别,于是直接正则匹配图片下载到本地,然后手工读取,在输入:
1234567[code]''' download captcha'''
reg
=
r
'<img id="captcha_image" src="(.*?)" alt="captcha" class="captcha_image"/>'
imglist
=
re.findall(reg,html)
urllib.urlretrieve(imglist[
0
],
'%d.jpg'
%
random.randint(
1
,
100
))
captcha
=
raw_input
(
'captchais: '
)
regid
=
r
'<input type="hidden" name="captcha-id" value="(.*?)"/>'
ids
=
re.findall(regid,html)
[/code]再次发送
12345[code]''' repost '''
my_post[
"captcha-solution"
]
=
captcha
my_post[
"captcha-id"
]
=
ids[
0
]
q
=
requests.post(login_url,data
=
my_post,headers
=
headers)
print
q.url
[/code]
如果登录成功,返回的URL就是:http://www.douban.com/doumail/,然后就可以正在获得用户信息了。
123456789101112131415161718192021[code]''' use bs4filterdouban.com's doumail following'''
if
q.url
=
=
"http://www.douban.com/doumail/"
:
print
" login successfully!"
soup
=
BeautifulSoup(q.text)
tag
=
soup.find_all(
'span'
,attrs
=
{
'class'
:
'from'
})
tag2
=
soup.find_all(
'a'
,attrs
=
{
'class'
:
'url'
})
a
=
[]
for
x
in
tag:
a.append(x.get_text())
b
=
[]
for
y
in
tag2:
b.append(y.get_text())
def
split(num):
print
a[num]
+
'  '
+
b[num]
print
 
print
'-'
*
30
,u
'豆瓣豆邮'
,
'-'
*
30
for
x
in
range
(
len
(a)):
split(x)
print
'-'
*
80
[/code]其实有很多种方法都可以实现,这只是一种,我也是在探索,希望和我一样的人可以一起探讨,如果是大牛的话,请多多指教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: