1.首先使用get请求获取登录时候需要用验证码
2.保存验证码到本地,并且手工输入验证码
3.使用Chrome浏览器打开开发模式,切换到netword下获取请求模拟登录获取请求需要的参数
4.登录成功开始爬取文章
注:改demo只是用来练手并记录一下,所以健壮性没有处理好
import requests
from lxml import etree
from PIL import Image
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'
}
#登录之后获取文章的内容
def get_article_data(input_code,image_id):
form_data = {
'source': None,
'redir': 'https://www.douban.com',
'form_email': '12345@qq.com', #输入你对应的账号
'form_password': '111111', #替换密码
'captcha-solution': input_code,
'captcha-id': image_id,
'login': '%E7%99%BB%E5%BD%95'
}
s = requests.session()
#模拟登录操作
login_data = s.post('https://accounts.douban.com/login', headers=header, data=form_data)
login_selecotor = etree.HTML(login_data.content)
article_list = login_selecotor.xpath('//div[@data-uid = "900117594"]')
for article in range(len((article_list))):
print login_selecotor.xpath("//div[@class='title']/a/text()")[article].encode('utf-8')
#保存并显示图片
def save_and_show_code(url):
# 获取图片
image_content = requests.get(url, headers=header)
# 保存图片到本地
with open('code.jpg', 'wb') as fp:
fp.write(image_content.content)
# 使用PIL打开图片
img = Image.open('code.jpg')
img.show()
def mian():
# 用get请求登录的页面,获取图片验证码
login_html = requests.get("https://accounts.douban.com/login", headers=header)
# print login_html.content
selector = etree.HTML(login_html.text)
# 获取图片验证码的网络路径
image_code = selector.xpath('//*[@id="captcha_image"]/@src')[0]
# 获取图片对应的id
image_id = image_code.split('=')[1].split('&')[0]
#显示验证码
save_and_show_code(image_code)
#获取手工填入的验证码
input_code = None
input_code = raw_input(u'请输入图形验证码')
#获取登录后的文章数据
get_article_data(input_code,image_id)
if __name__ == '__main__':
mian()
网友评论