用python的cookielib模拟登录虎扑下载相册图片

    虎扑里有个大神叫科比ni很帅,他的虎扑相册里有很多科比的精美gif,其质量之高,内容之广,虎扑中无出其右。无奈图片数量太大,如果一张一张右键保存工作量相当可观。之前我也写过抓取虎扑帖子上图片的程序。奈何虎扑相册需要登录才能查看,于是我利用周末的时间学习了一下python的模拟登录,写了个小程序。由于初学,程序可能比较渣,有大神路过希望能给与指导,如果也有初学者路过,欢迎一同探讨。

    首先要登录肯定要Post一些信息给服务器,登录虎扑还比较简单,每次登录都会把你带到登录页面:http://passport.hupu.com/login。然后我们就用Firebug这个插件在Firefox上看看我们到底发送了什么数据。

    被我涂抹掉的部分是我的密码。我们要发送的数据已经就是用红圈圈起来的Source下边的内容。其实如果不利用cookielib,直接向虎扑发送这些数据就能实现登录,但是这样的话,我们只能获得登录成功界面,这是没什么用的。我们要带着登录信息在网页上浏览才能看到人家的相册。

    我们建立一个CookieJar的对象,用于收集cookie,然后建立一个能够处理cookie的opener,这样就完成了主要部分,剩下的就是解析获得的HTML文件,用HTMLParser还是正则表达式就随意了,我一般是网页中稀少的东西用正则表达式提取,如果网页中比较多就用HTMLParser。下边把代码贴上来吧。

import urllib2
import cookielib
import re
import os
from HTMLParser import HTMLParser

class Photo(HTMLParser):

    header={\
            'User-Agent' : 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:36.0) Gecko/20100101 Firefox/36.0'\
            }

    def __init__(self):
        HTMLParser.__init__(self)
        self.opener=None
        self.getOpener()
        self.start=False
        self.image_list=[]

    def handle_starttag(self,tag,attrs):
        if(tag=='div'):
            if([('class','albumlist_list')] == attrs):
                self.start=True
        elif(self.start and tag=='a'):
            if(len(attrs)==1 and 'href' in attrs[0]):
                self.image_list.append(attrs[0][1])
        else:
            pass

    def handle_endtag(self,tag):
        if(self.start and tag=='div'):
            self.start=False

    def getOpener(self):
        data='mobile=&code=&authCode=&usernameMobile=&username=shuoyin&password=*****&charset=utf-8&jumpurl=http%3A%2F%2Fnba.hupu.com%2F&captcha%5Bclient_public_key%5D=&captcha%5Bclient_token%5D=&isNewSeccode=&mode=email'
        request=urllib2.Request('http://passport.hupu.com/login',data,Photo.header)#'*' represents for my password
        cookie=cookielib.CookieJar()
        handle=urllib2.HTTPCookieProcessor(cookie)
        self.opener=urllib2.build_opener((handle))
        self.opener.open(request)

    def getimagelinks(self,url):
        pattern='<a href="(\\S*?)" class="next">'
        pattern=re.compile(pattern)
        while url:
            request=urllib2.Request(url,headers=Photo.header)
            html=self.opener.open(request).read()
            self.feed(html)
            x=pattern.search(html)
            url=(x!=None and 'http://my.hupu.com'+x.groups()[0] or None)
        
    def download(self,url,save_path):
        try:
            os.makedirs(save_path)
        except:
            pass
        self.image_list=[]
        self.getimagelinks(url)
        print self.image_list
        alt=open(os.path.join(save_path,'alt.txt'),'w')
        pattern=re.compile('<img id="bigpic" alt="(.*?)" src="(\\S*?)"')
        for num,link in enumerate(self.image_list):
            fullurl='http://my.hupu.com'+link
            request=urllib2.Request(fullurl,headers=Photo.header)
            html=self.opener.open(request).read()
            x=pattern.findall(html)
            alt.write('%d: '%num)
            alt.write(x[0][0])
            alt.write('\n')
            try:
                img=urllib2.urlopen(x[0][1]).read()
            except urllib2.URLError,e:
                print '%d Failed, reason: '%num,e
                continue
            imgname='%d.'%num+x[0][1][-3:]
            saveimg=open(os.path.join(save_path,imgname),'w+b')
            saveimg.write(img)
            saveimg.close()


if __name__=="__main__":
    m=Photo()
    url=raw_input('Please enter the url of the album:\n')
    path=raw_input('please enter the path you want to keep them:\n')
    m.download(url,path)

样例输入:

http://my.hupu.com/4636142/photo/a143789.html

/home/yinshuo/kobe/clutch

由于程序写的不是很健壮,所以只能接受完整的URL和完整的路径。并且受制于我的可怜的网络知识,只能是相册第一页(也就是一个相册的根目录)

另外,每个相册打开之后都会有一个图片处于选中状态,造成这个图片无法被我的程序识别出来,我不想为了这一个图片而加入一个特例,又没有想出一个好的方法。所以现在这个程序有个bug,谁有好的方法希望能教教我。下边是下载完成之后的效果。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python可以使用一些库来模拟登录。 你可以使用 `requests` 库来模拟发送 HTTP 请求。例如,你可以使用 `requests.post()` 方法来发送登录表单。 为了处理网站的登录验证机制,你还可以使用 `cookielib` 库来管理 Cookies。 你还可以使用第三方库,例如 `mechanicalsoup` 来自动化这个过程。 下面是一个使用 `requests` 库的登录模拟的简单示例: ``` import requests # 登录表单数据 payload = { 'username': 'my_username', 'password': 'my_password' } # 发送登录请求 r = requests.post('http://www.example.com/login', data=payload) # 检查响应是否成功 if r.status_code == 200: print('登录成功') else: print('登录失败') ``` 这只是一个简单的示例,你可能还需要更多的代码来处理特定网站的登录流程。 ### 回答2: Python模拟登录是一种通过编写Python脚本来实现自动登录网站或应用程序的过程。通常,模拟登录包含以下步骤: 首先,我们需要了解要登录的网站或应用程序的登录流程。这可能涉及到向服务器发送登录请求,包括用户名和密码等信息。 其次,我们可以使用Python的请求库(例如requests)来发送这个登录请求。我们可以通过POST方法将用户名和密码作为参数发送到服务器。 接下来,我们需要处理服务器返回的响应。如果登录成功,服务器可能会返回一个包含用户登录信息的Cookie,我们需要保存这个Cookie,以便于在后续的请求中进行验证。 最后,我们可以使用保存的Cookie来发送其他请求,这样我们就可以在登录状态下访问网站的其他页面或执行其他操作。 为了完成以上步骤,我们可以编写一个Python函数来自动化这个登录过程。这个函数可以接受用户名和密码作为参数,并返回登录成功后的Cookie。 需要注意的是,模拟登录可能违反某些网站或应用程序的使用条款。使用Python模拟登录时,我们需要确保自己遵守合适的权限和道德规范,同时保护用户的隐私和数据安全。 综上所述,Python模拟登录是一个使用Python脚本来实现自动登录网站或应用程序的过程。通过理解登录流程,并使用Python的请求库发送登录请求和处理服务器返回的响应,我们可以实现自动化登录并访问其他页面的功能。然而,在进行模拟登录时,我们需要遵守合适的规范和保护用户的隐私和数据安全。 ### 回答3: Python模拟登录是指使用Python代码模拟用户登录一个网站或应用程序。通常,网站或应用程序会要求用户提供用户名和密码来验证身份。要在Python中实现模拟登录,可以按照以下步骤进行操作: 1. 导入所需的库:首先,导入所需的库,例如requests和BeautifulSoup。Request库用于向服务器发送HTTP请求,而BeautifulSoup库用于解析HTML网页。 2. 获取登录页面:使用requests库向登录页面发送HTTP请求,获取页面的HTML内容。 3. 提取表单数据:使用BeautifulSoup库解析HTML内容,并提取登录表单中的所有字段,例如用户名和密码。 4. 创建登录请求:根据提取到的表单字段,创建一个POST请求,将用户名和密码作为参数传递给请求。 5. 发送登录请求:使用requests库发送登录请求,并获取服务器的响应。 6. 验证登录成功:根据服务器的响应,验证登录是否成功。可以检查响应中是否包含成功登录后的页面标识,或者检查响应的状态码。 7. 进一步操作:登录成功后,可以进一步操作,例如访问登录后的页面、爬取一些数据或执行其他操作。 需要注意的是,模拟登录涉及到使用他人的账号和密码,应该获得所有者的授权才能进行操作。此外,不同网站或应用程序的登录机制可能会有所不同,需要根据具体情况进行调整和修改代码。 以上是Python模拟登录的大致步骤和思路。通过使用requests和BeautifulSoup等库,可以方便地实现登录功能,并对登录后的页面进行操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值