参考地址:http://www.jianshu.com/p/3debfb110ad9
最近做了一个网络爬虫的题,要求:访问一个链接,页面中含有同样的另一个链接信息,需要提取出来,再次访问,直到访问到某一个链接跳转到成功页面。
解析:就是一个网页爬取,主要遇到的困难时如何保存登录信息,由于对python不熟,加上其中各方面的小错误没注意导致一直得不出结果,现在回顾发现有很多这一个简单地题目其实涉及到很多知识点。包括:登录提交的数据格式获取、运用浏览器工具获取提交信息、正则表达式以及注意转义字符、浏览器缓存、字符串匹配等。
import re
import requests
import http.cookiejar
from PIL import Image
import time
import json
# 头信息
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 '
'(KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36',
"Host": "xdmsc.club",
"Referer": "https://xdmsc.club/",
}
# 建立一个会话,可以把同一用户的不同请求联系起来;直到会话结束都会自动处理cookies
session = requests.Session()
# 建立LWPCookieJar实例,可以存Set-Cookie3类型的文件。
# 而MozillaCookieJar类是存为'/.txt'格式的文件
session.cookies = http.cookiejar.LWPCookieJar("cookie")
# 若本地有cookie则不用再post数据了
try:
session.cookies.load(ignore_discard=True)
except IOError:
print('Cookie未加载!')
def get_xsrf():
"""
获取网站登录的动态参数post
获取参数_xsrf
"""
response = session.get('https://xdmsc.club/question/login', headers=headers)
html = response.text
get_xsrf_pattern = re.compile(r"<input type='hidden' name='csrfmiddlewaretoken' value='(.*?)'")
_xsrf = re.findall(get_xsrf_pattern, html)[0]
print(_xsrf)
return _xsrf
# def get_captcha():
# """
# 获取验证码本地显示
# 返回你输入的验证码
# """
# t = str(int(time.time() * 1000))
# captcha_url = 'http://www.zhihu.com/captcha.gif?r=' + t + "&type=login"
# response = session.get(captcha_url, headers=headers)
# with open('cptcha.gif', 'wb') as f:
# f.write(response.content)
# # Pillow显示验证码
# im = Image.open('cptcha.gif')
# im.show()
# captcha = input('本次登录需要输入验证码: ')
# return captcha
def getHtml(session,url):
"""
获取页面内容
"""
return session.get(url).text
def getImg(html):
"""
获取特定位置信息(链接)
"""
imgre = re.compile(r"answer=(.*?)<")
imglist = re.findall(imgre, html)[0]
print(imglist)
return "https://xdmsc.club/question/web/5/?answer="+imglist
def login(email, number):
"""
输入自己的账号密码,模拟登录知乎
"""
# # 检测到11位数字则是手机登录
# if re.match(r'\d{11}$', username):
url = 'https://xdmsc.club/question/login'
data = {
'email': email,
'number': number,
'csrfmiddlewaretoken': get_xsrf()
}
# else:
# url = 'https://www.zhihu.com/login/email'
# data = {'_xsrf': get_xsrf(),
# 'password': password,
# 'remember_me': 'true',
# 'email': username
# }
# 若不用验证码,直接登录
result = session.post(url, data=data, headers=headers)
print(result)
# 打印返回的响应,r = 1代表响应失败,msg里是失败的原因
# loads可以反序列化内置数据类型,而load可以从文件读取
# if (json.loads(result.text))["r"] == 1:
# # 要用验证码,post后登录
# data['captcha'] = get_captcha()
# result = session.post(url, data=data, headers=headers)
# print((json.loads(result.text))['msg'])
# 保存cookie到本地
session.cookies.save(ignore_discard=True, ignore_expires=True)
ourl = 'https://xdmsc.club/question/web/5/?answer=fad39d71'
numberx = 0
while True:
numberx += 1
print(numberx)
html = getHtml(session,ourl)
ourl = getImg(html)
def isLogin():
# 通过查看用户个人信息来判断是否已经登录
url = "https://www.zhihu.com/settings/profile"
# 禁止重定向,否则登录失败重定向到首页也是响应200
login_code = session.get(url, headers=headers, allow_redirects=False).status_code
if login_code == 200:
return True
else:
return False
if __name__ == '__main__':
# if isLogin():
# print('您已经登录')
# else:
# account = input('输入账号:')
# secret = input('输入密码:')
account = '123@qq.com'
secret = '130'
login(account, secret)