知乎模拟登录例子
在模拟登录时,打开开发者工具,在登录时,为了得到确切的请求地址,需要输入错误的密码,因为输入正确时,会跳转,得到多个请求地址,混淆视线。得到地址后,找到需要的提交的参数,有些参数可以在隐藏的输入框中得到,可以通过爬虫提取出来。
import requests
try:
import cookielib #内容针对python2
except:
import http.cookiejar as cookielib #python3
session = requests.session()
session.cookies = cookielib.LWPCookieJar(filename='cookies.txt')
agent = '此处省略'
header = {
'HOST':'www.zhihu.com',
'Referer':'https://www.zhihu.com',
'User-Agent':agent
}
def login_in(username, password):
post_url = '爬取地址'
post_data = {
'username':username,
'password':password,
#此处为需要提交的内容
}
response_text = session.post(post_url, data=post_data, headers=header)
session.cookies.save()
def is_login():
inbox_url = '个人中心url'
response = session.get(inbox_url, headers = header, allow_redirects=False) # allow_redirects如果返回302,不允许重定向,到另一个页面
if response.status_code != 200:
return False
else:
return True
现在改用scrapy模拟登录了:
#重写下面函数
class ZhihuLogin:
def start_requests(self):
return [scrapy.Request('https://www.zhihu.com/#signin', headers = header, callback=self.login) #如果没有callback会默认调用parse函数
def login(self, response):
post_url = '爬取地址'
post_data = {
'username':username,
'password':password,
#此处为需要提交的内容
}
return [scrapy.FormRequest(
url = post_url,
formdata = post_data,
headers = header,
callback = is_login #验证是否登录成功
)]
def is_login(self, response):
text_json = json.loads(response.text)
for url in self.start_urls:
yield scrapy.Request(url, dont_filter = True, headers = header)
识别验证码(手动填写):
from PIL import Image #需要pillow库
try:
im = Image.open('capt.jpg') #需要下载到本地,运行到这里自动打开图片
im.show()
im.close()
except:
pass
captcha = raw_input('输入验证码:')
下面介绍一个去掉html tag的库
from w3lib.html import remove_tags
str = "<html>i<span>hello</span></html>"
remove_tags(str)
# ihello