好几天过去了,终于可以更新第二篇爬虫,这次想用python爬虫模拟登陆豆瓣并爬取主页上精选内容的标题部分,确认登录成功。
前期分析
首先我们要模拟登陆豆瓣就必须先知道真实的用户登录豆瓣是个什么流程。因此我们可以打开chrome浏览器开发者工具抓包分析,豆瓣的网站登录流程以及需要post的对应的信息。这边以豆瓣为实例:
这就是我们需要提交的信息,包括用户名和密码,以及验证码和验证码的ID,想要模拟豆瓣登录就要构造一个相同的post请求。
工具使用
这一次我们会使用resquests这个库了,因为requests直接省去了urllib和urllib2的很多麻烦,省去了很多冗余的代码,如果不熟悉可以去官网去查看。Requests
另外还需要对bs4有一定的了解,会省去不少麻烦,以及RE正则表达式,这里快捷下帮助文档。 BeautifulSoup
基本框架
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import urllib
import re
url = 'https://accounts.douban.com/login'
#构造post数据
data={
'redir': 'https://www.douban.com/people/138461169/',
'form_email':'xxxxxx',
'form_password':'xxxxxx',
'login':u'登录'
}
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
r = requests.post(url, data, headers=headers)
page = r.text
#利用bs4获得验证码图片地址
soup = BeautifulSoup(page,"html.parser")
captcha_url = soup.find('img',id='captcha_image')['src']
#利用正则获得验证码ID
pattern = re.compile('<input type="hidden" name="captcha-id" value="(.*?)"/')
captcha_id = re.findall(pattern, page)
#将验证码图片保存到本地
urllib.urlretrieve(captcha_url,"captcha.jpg")
captcha = raw_input('please input the captcha:')
data['captcha-solution'] = captcha
data['captcha-id'] = captcha_id
r = requests.post(url, data=data, headers=headers)
page = r.text
测试打开本地验证码图片,输入。
登录成功抓取标题
成功登录后需要爬取热门精选的标题
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import urllib
import re
url = 'https://accounts.douban.com/login'
data={
'redir': 'https://www.douban.com/',
'form_email':'xxxxxx',
'form_password':'xxxxxx',
'login':u'登录'
}
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
r = requests.post(url, data, headers=headers)
page = r.text
soup = BeautifulSoup(page,"html.parser")
captcha_url = soup.find('img',id='captcha_image')['src']
pattern = re.compile('<input type="hidden" name="captcha-id" value="(.*?)"/')
captcha_id = re.findall(pattern, page)
urllib.urlretrieve(captcha_url,"captcha.jpg")
captcha = raw_input('please input the captcha:')
data['captcha-solution'] = captcha
data['captcha-id'] = captcha_id
r = requests.post(url, data=data, headers=headers)
page = r.text
soup = BeautifulSoup(page,"html.parser")
result = soup.findAll('div',attrs={'class':'title'})
# print result
for item in result:
print item.find('a').get_text()
原网页内容:
下图就是抓取到的内容:
到这里已经完成了初步的脚本,因为实验暂时做到这。
面向对象改写代码
数据库存储
这俩块还需要完善更新...