用python做有趣的事儿——模拟登陆知乎

用Python做网络数据采集,是非常方便的。特别是使用第三方库requests。
window下安装方法 pip install requests
处理网页超文本信息,使用第三方库BeautifulSoup,也是很方便。
window下安装方法 pip install beautifulsoup4
通常会用到的是requests.get()和requests.post()。其他的,当你需要的时候去官方文档是最好的捷径。
我们处理的还是HTML,了解一些HTML是必须的,起码得知道标签,属性,属性值等等,只有这样我们才能在一堆信息里提取出我们想要得信息。
最近在看《Python网络数据采集》,打算拿知乎当作练手的网站(心疼知乎-。-)。知乎毕竟是企业级的网站,在模拟登录的时候遇到了很多挫折,对,就是挫折,前几天因为一直登录不上还放弃过(呸,丢人的家伙)。今天不经意的在书中看到隐藏字段,恍然大悟。原来知乎的表单里有隐藏字段啊。
通过BeautifulSoup过滤出隐藏字段,然后post,但是还是不能登录成功,很恼火。逼不得已上网看了别人的源码,竟然有验证码,我在知乎的网页端没看见啊,所以我把验证码的这快程序加上,结果,,,,登录成功。好吧,知乎你赢了。

# -*- coding: utf-8 -*-
'''
Info
- auther  : Cherish_x
- qq      : 344799672
- data    : 2017.9.8
'''
import re
import time
import requests
from io import BytesIO
from PIL import Image
from bs4 import BeautifulSoup

loadpost_url = 'https://www.zhihu.com/login/phone_num'
load_url = 'https://www.zhihu.com/#signin'
agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36'
headers = {
    'User-Agent': agent,
    'Referer': 'https://www.zhihu.com/',
    'Host': 'www.zhihu.com'

}
FormData = {
    '_xsrf': '',
    'password': 'xu344799672',
    'phone_num': '17853530696'
}
#———————————————————————————————————————————————————————————
#       模拟登陆知乎
def anaLoad(load_url, loadpost_url, headers, FormData):
    #—————————————————————————————————————————————————————————
    #   保持会话信息
    session = requests.session()
    #—————————————————————————————————————————————————————————
    #   获取动态参数_xsrf
    r = session.get(load_url, headers=headers)
    _xsrf = r.cookies['_xsrf']
    FormData['_xsrf'] = _xsrf
    #—————————————————————————————————————————————————————————
    #   获取验证码,并以照片的形式打开,手动输入
    randomtime = str(int(time.time() * 1000))
    captchaurl = 'https://www.zhihu.com/captcha.gif?r=' + \
                 randomtime + "&type=login"
    captcharesponse = session.get(url=captchaurl, headers=headers)
    tempIm = BytesIO(captcharesponse.content)  # 将数据流放入tempIm以字节的形式
    im = Image.open(tempIm)  # 转换为图片的形式
    im.show()  # 打开
    captch = input('Please input coding:')
    #—————————————————————————————————————————————————————————
    #   登录
    FormData['captcha'] =captch
    posthtml = session.post(loadpost_url, data=FormData, headers=headers)
    #print(posthtml.cookies)
    msg = eval(posthtml.text)#  转为字典格式
    print(msg['msg'])
    return session  #返回会话信息,以备下次使用

#———————————————————————————————————————————————————————————
#   跳转知乎内链
def throughUrl(session, headers):
    urlList = []
    r = session.get('https://www.zhihu.com/#signin', headers=headers)
    bs0bj = BeautifulSoup(r.text, 'html.parser')
    Text = bs0bj.findAll('meta', {'itemprop': 'url'})
    for i in Text:
        i = i.attrs['content']
        if i not in urlList and 'www.zhihu.com' in i:#  去重、去外链(知乎专栏,不能跳转,待解决)
            urlList.append(i)
            accessUrl(session, i, headers, urlList)




#———————————————————————————————————————————————————————————
#   访问链接
def accessUrl(session, url, headers, urlList):
    r = session.get(url, headers=headers)
    bs0bj = BeautifulSoup(r.text, 'html.parser')
    #text = bs0bj.findAll('span', {'itemprop': 'text'})
    text = bs0bj.findAll('meta', {'itemprop': 'name'})
    print(text)
    print('——————————————————————————————————————————————————')
    html = bs0bj.findAll('meta', {'itemprop': 'url'})#  寻找链接所在
    for i in html:
        i = i.attrs['content']
        if i not in urlList and 'www.zhihu.com' in i:#  去重、去外链(知乎专栏,不能跳转,待解决)
            urlList.append(i)
            time.sleep(3)
            accessUrl(session, i, headers, urlList)

if __name__ == '__main__':
    session = anaLoad(load_url, loadpost_url, headers, FormData)
    throughUrl(session, headers)

目前实现了模拟登陆知乎,遍历采集的知乎内链(去重检查),值得注意的是,一定要有延时,应为知乎的防爬意识很严肃,在调试程序的时候,我就经常被知乎封ip,此时需要用网页登录一次输入验证码即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值