我的博客中曾经贴过几个爬虫程序的代码,用来批量下载图片非常方便。这样的爬虫实现起来比较简单。而有些网站需要用户登录之后才可以下载文件,之前的方法就办不到了。今天就说说用Python模拟浏览器的登录过程,为之后的登录下载做好准备。登录的情况,需要额外用到的一个模块是cookielib,用来记住登录成功之后保存到本地的cookie,方便在网站的各个页面之间穿越。
先上代码示例:
#encoding=utf8
import urllib
import urllib2
import cookielib
###登录页的url
lgurl = 'http://mlook.mobi/member/login'
###用cookielib模块创建一个对象,再用urlllib2模块创建一个cookie的handler
cookie = cookielib.CookieJar()
cookie_handler = urllib2.HTTPCookieProcessor(cookie)
###有些网站反爬虫,这里用headers把程序伪装成浏览器
hds = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36'}
###登录需要提交的表单
pstdata = {
'formhash':'', #填入formhash
'person[login]':'', #填入网站的用户名
'person[password]':'', #填入网站密码
}
dt = urllib.urlencode(pstdata)
#表单数据编码成url识别的格式
req = urllib2.Request(url = lgurl,data = dt,headers = hds)
#伪装成浏览器,访问该页面,并POST表单数据,这里并没有实际访问,只是创建了一个有该功能的对象
opener = urllib2.build_opener(cookie_handler)
#绑定handler,创建一个自定义的opener
response = opener.open(req)
#请求网页,返回句柄
page = response.read()
#读取并返回网页内容
print page
#打印到终端显示说明一下:
我这里就不提供用户名密码了。关于需要提交的表单数据,chrome用户可以F12 -> Network -> 填好账号密码并登录 -> 在Network找到POST...,请看截图。

点击「login」进入下图界面。

1、「From Data」里面数据比较多,通常需要用户名、密码,其余的数据是否必要,需要测试一下。对于这个网站,还需要「formhash」。
2、Linux下无编码问题,win下如果出现编码问题应该是终端对编码的支持不到位。
3、登录成功之后,我们创建的cookie_handler会自动管理cookie,程序的后面如果需要访问其他页面,用opener打开其url即可。
4、「User-Agent」同样可以通过F12查看到。
5、这篇博客重点不在介绍原理,重点是记录下这个简单的代码块,其他需要登录的爬虫仿写就可以了。
先大致总结一下登录的几个步骤
1、添加Cookie配置 一般需要账号密码登陆的,直接网址或者模仿浏览器操作是无法进入的,一般的解决方法是用python的一个模块是cookielib,用来记住登录成功之后保存到本地的cookie;
2、添加登录需要提交的表单信息 一般postdata的信息为登陆的用户名,密码什么的,还有许多其他的信息,其余的数据是否必要,需要测试一下; 查看这个就可以用httpfox 或者审查元素的nextwork里面,当你点击登录的时候,在审查元素的network里面可以看到post 、get的数据信息;这里就可以按照我们需要的来拿; 下面是模仿登录人人网的代码;代码注释挺细的。以便以后回忆~~
import urllib2,urllib,cookielib
#设置cookie
cookiejar= cookielib.CookieJar()
cookie=urllib2.HTTPCookieProcessor(cookiejar)
opener= urllib2.build_opener(cookie,urllib2.HTTPHandler())
urllib2.install_opener(opener)
#账号信息
email=raw_input('输入邮箱')
password=raw_input('输入密码')
domain='renren.com'#域名
url='http://www.renren.com/PLogin.do'#可以通过审查元素得到
#httpfox抓取数据包信息, 其中headers和domain 可有可无 postdata里面很多元素;最主要的用户名密码
#d对付反爬虫
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0'
}
data={
'email' : email,
'password' : password,
'domain': domain
}
#编码data
postdata = urllib.urlencode(data)
#发起请求
req=urllib2.Request(url,postdata,headers)
#获取源码
print urllib2.urlopen(req).read()【应用】一个Python爬虫工具类whyspider:
# -*- coding: utf-8 -*-
#---------------------------------------
# 程序:whyspider.py
# 版本:0.2
# 作者:why
# 日期:2014-04-18
# 语言:Python 2.7.5
#
# 版本列表:
# 0.1:添加GET和POST
# 0.2:添加模拟头的功能
#---------------------------------------
import urllib
import urllib2
import cookielib
import re
import string
class WhySpider:
# 初始化爬虫
def __init__(self):
self.cookie_jar = cookielib.CookieJar()
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie_jar))
self.headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0'}
# 发送GET请求
def send_get(self,get_url):
result = ""
try:
my_request = urllib2.Request(url = get_url, headers = self.headers)
result = self.opener.open(my_request).read()
except Exception,e:
print "Exception : ",e
return result
# 发送POST请求
def send_post(self,post_url,post_data):
result = ""
try:
my_request = urllib2.Request(url = post_url,data = post_data, headers = self.headers)
result = self.opener.open(my_request).read()
except Exception,e:
print "Exception : ",e
return result
# 模拟电脑
def set_computer(self):
user_agent = 'Mozilla/5.0 (Windows NT 6.3; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0'
self.headers = { 'User-Agent' : user_agent }
# 模拟手机
def set_mobile(self):
user_agent = 'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25'
self.headers = { 'User-Agent' : user_agent }调用方法很简单:
# -*- coding: utf-8 -*-
import whyspider
# 初始化爬虫对象
my_spider = whyspider.WhySpider()
# 模拟GET操作
print my_spider.send_get('http://3.apitool.sinaapp.com/?why=GetString2333')
# 模拟POST操作
print my_spider.send_post('http://3.apitool.sinaapp.com/','why=PostString2333')
# 模拟GET操作
print my_spider.send_get('http://www.baidu.com/')
# 切换到手机模式
my_spider.set_mobile()
# 模拟GET操作
print my_spider.send_get('http://www.baidu.com/')python实现自动登录人人网并采集信息的方法:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import re
import urllib2
import urllib
import cookielib
class Renren(object):
def __init__(self):
self.name = self.pwd = self.content = self.domain = self.origURL = ''
self.operate = ''#登录进去的操作对象
self.cj = cookielib.LWPCookieJar()
try:
self.cj.revert('./renren.coockie')
except Exception,e:
print e
self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))
urllib2.install_opener(self.opener)
def setinfo(self,username,password,domain,origURL):
'''设置用户登录信息'''
self.name = username
self.pwd = password
self.domain = domain
self.origURL = origURL
def login(self):
'''登录人人网'''
params = {
'domain':self.domain,
'origURL':self.origURL,
'email':self.name,
'password':self.pwd}
print 'login.......'
req = urllib2.Request(
'http://www.renren.com/PLogin.do',
urllib.urlencode(params)
)
self.file=urllib2.urlopen(req).read()
newsfeed = open('news.html','w')
try:
newsfeed.write(self.file)
except Exception, e:
newsfeed.close()
self.operate = self.opener.open(req)
print type(self.operate)
print self.operate.geturl()
if self.operate.geturl():
print 'Logged on successfully!'
self.cj.save('./renren.coockie')
self.__viewnewinfo()
else:
print 'Logged on error'
def __viewnewinfo(self):
'''查看好友的更新状态'''
self.__caiinfo()
def __caiinfo(self):
'''采集信息'''
h3patten = re.compile('<article>(.*?)</article>')#匹配范围
apatten = re.compile('<h3.+>(.+)</h3>:')#匹配作者
cpatten = re.compile('</a>(.+)\s')#匹配内容
content = h3patten.findall(self.file)
print len(content)
infocontent = self.operate.readlines()
print type(infocontent)
print 'friend newinfo:'
for i in infocontent:
content = h3patten.findall(i)
if len(content) != 0:
for m in content:
username = apatten.findall(m)
info = cpatten.findall(m)
if len(username) !=0:
print username[0],'说:',info[0]
print '----------------------------------------------'
else:
continue
ren = Renren()
username = 'username'#你的人人网的帐号
password = 'password'#你的人人网的密码
domain = 'www.renren.com'#人人网的地址
origURL = 'http://www.renren.com/home'#人人网登录以后的地址
ren.setinfo(username,password,domain,origURL)
ren.login()
- 本文固定链接: http://ttfde.top/index.php/post/314.html
- 转载请注明: admin 于 TTF的家园 发表
《本文》有 0 条评论