学爬虫有一段时间了,前面没有总结又重装了系统,导致之前的代码和思考都没了。。所以还是要及时整理总结备份。下面记录我模拟登陆豆瓣的方法,方法一登上了豆瓣,方法二重定向到了豆瓣中“我的喜欢”列表,获取了第一页上我喜欢的帖子标题。
方法一:使用requests库和cookies登陆
- 先正常登录一下豆瓣,然后使用火狐浏览器的httpfox插件获得post选项中的cookies,将cookies的内容分复制下来,保存为一个.txt文件
- 然后将txt中的内容用以下代码处理成字典,以便之后使用
1 import re 2 pattern = re.compile('(.*?)/.*?') #只需要提取cookies的前两项cookie sent,value就行了 3 fr = open('dealwithcookies.txt','r') #dealwithcookies是把网站上的cookies复制粘贴进去的文件 4 l = [] 5 for item in fr.readlines(): 6 item = str(item) 7 item = pattern.search(item).group(1) 8 #第七行使用item = re.search(pattern).group(1)会报错‘TypeError: expected string or buffer’,使用item = pattern.search(item).group(1) 就不会有这个错误 9 l.append(item) 10 fr.close() 11 cookies = {} 12 for i in l: 13 key, value = i.split(' ',1) #每行有多个‘ ’,只分开第一个 14 cookies[key] = value
- 用以下代码模拟登陆豆瓣:
import requests s=requests.get(testurl, cookies=cookies)
- 此时就能登陆了!
问题:cookies必须手动获取吗?还在找解决方法
方法二:使用requests.post直接带上用户名/密码/headers等信息登陆豆瓣,因为豆瓣有时需要填写验证码,因此我先登陆一遍,使用豆瓣转到的带有验证码的网址将验证码下载到本地,手动输入验证码后,将需要post的data加上验证码信息再post。
代码:
# -*- encoding:utf-8 -*- import requests import urllib2 import re import urllib from bs4 import BeautifulSoup loginUrl = 'https://www.douban.com/accounts/login' formdata = {'form_email':'144XXXXX530@qq.com', 'form_password':'XXXXX', 'redir':'https://www.douban.com/people/67249180/likes/'} headers = {"User-Agent":'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0'} r = requests.post(loginUrl,data=formdata,headers=headers) page = r.text print r.url #此时page是需要填写验证码再进行登陆的界面 soup = BeautifulSoup(page,'html.parser') captchaAddr = soup.find('img',id='captcha_image')['src'] #利用正则表达式获取captcha的ID reCaptchaID = r'<input type="hidden" name="captcha-id" value="(.*?)"/' captchaID = re.findall(reCaptchaID,page) #print captchaID #保存到本地 urllib.urlretrieve(captchaAddr,"captcha.jpg") captcha = raw_input('please input the captcha:') formdata['captcha-solution'] = captcha formdata['captcha-id'] = captchaID r = requests.post(loginUrl,data = formdata,headers = headers) #获取验证码以后再提交一遍 print r.url page = r.text if r.url == 'https://www.douban.com/people/67249180/likes/': soup = BeautifulSoup(page,'html.parser') result = soup.findAll('div',class_='title') #print result for item in result: print item.find('a').get_text()
其中字典的键值都是通过网页源代码获得的。
使用BeautifulSoup匹配关键词,也可以使用正则表达式,看你觉得哪一种的逻辑好理解了。