在做glidesky第二题的时候需要使用模拟登录,刚开始尝试如下:
def login(s):
login_url = 'http://www.glidedsky.com/login'
res = s.get(url = login_url)
_token = re.findall('<meta name="csrf-token" content="(.*?)">',res.text)[0]
data = {'_token': _token,'email': '账号','password': '密码'}
s.post(url = login_url,data = data)
return s
s = requests.Session()
ss = login(s)
#请求目标网页
url = 'http://www.glidedsky.com/level/web/crawler-basic-2?page=1'
res2 = ss.get(url = url)
selector = etree.HTML(res2.text)
items = selector.xpath('//div[@class="col-md-1"]/text()')
print(items)
此时登录成功,且拿到了数据。
后来发现代码可以这样写:
def login():
login_url = 'http://www.glidedsky.com/login'
res = s.get(url = login_url)
_token = re.findall('<meta name="csrf-token" content="(.*?)">',res.text)[0]
data = {'_token': _token,'email': '账号','password': '密码'}
s.post(url = login_url,data = data)
def crawler_pages():
for i in range(1,2):
url = 'http://www.glidedsky.com/level/web/crawler-basic-2?page=%d'%i
print('当前请求网页为:%s'%url)
res = s.get(url = url,headers = headers)
selector = etree.HTML(res.text)
items = selector.xpath('//div[@class="col-md-1"]/text()')
print(items)
s = requests.Session()
login()
crawler_pages()
发现也能拿到数据。
原以为经实例化后的对象和变量一样(在函数内部的修改无法影响变量),但实际上在函数的内部调用对象内的方法,也是能影响对象的。
比如如下例子:
def test(a):
a = a + 1
print('函数内部的a为:',a)
a = 5
print(a)
test(a)
print(a)
输出结果为:
5
函数内部的a为: 6
5
对象在这一点上与变量不同,如下:
class Test:
def __init__(self,a) -> None:
self.a = a
def modify(self):
self.a = 'modify'
def go(self):
print(self.a)
def main():
test.modify()
test.go()
test = Test(3)
test.go()
print('............')
main()
print('............')
test.go()
此时的输出结果为:
3
............
modify
............
modify
若对象和变量一样,那么main()内部的test.modify()是无法修改a的值的,但在最后一行打印a的时候,可见a已经被修改为’modify’。