python爬虫模拟豆瓣登录

好几天过去了,终于可以更新第二篇爬虫,这次想用python爬虫模拟登陆豆瓣并爬取主页上精选内容的标题部分,确认登录成功。

前期分析

首先我们要模拟登陆豆瓣就必须先知道真实的用户登录豆瓣是个什么流程。因此我们可以打开chrome浏览器开发者工具抓包分析,豆瓣的网站登录流程以及需要post的对应的信息。这边以豆瓣为实例:


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()

原网页内容:


网页内容

下图就是抓取到的内容:


标题内容

 到这里已经完成了初步的脚本,因为实验暂时做到这。

面向对象改写代码

数据库存储

 这俩块还需要完善更新...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容