Session 是会话的意思,会话是产生在服务端的,用来保存当前用户的会话信息,
Cookies 是保存在客户端(浏览器),有了 Cookie 以后,客户端(浏览器)再次访问服务端的时候,会将这个 Cookie 带上,这时,服务端可以通过 Cookie 来识别本次请求到底是谁在访问。
可以简单理解为 Cookies 中保存了登录凭证,我们只要持有这个凭证,就可以在服务端保持一个登录状态。
在爬虫中,有时候遇到需要登录才能访问的网页,只需要在登录后获取了 Cookies ,在下次访问的时候将登录后获取到的 Cookies 放在请求头中,这时,服务端就会认为我们的爬虫是一个正常登录用户。
那么,Cookies 是如何保持会话状态的呢?
在客户端(浏览器)第一次请求服务端的时候,服务端会返回一个请求头中带有 Set-Cookie
字段的响应给客户端(浏览器),用来标记是哪一个用户,客户端(浏览器)会把这个 Cookies 给保存起来。
我们来使用工具 PostMan 来访问下某东的登录页,看下返回的响应头:
当我们输入好用户名和密码时,客户端会将这个 Cookies 放在请求头一起发送给服务端,这时,服务端就知道是谁在进行登录操作,并且可以判断这个人输入的用户名和密码对不对,如果输入正确,则在服务端的 Session 记录一下这个人已经登录成功了,下次再请求的时候这个人就是登录状态了。
如果客户端传给服务端的 Cookies 是无效的,或者这个 Cookies 根本不是由这个服务端下发的,或者这个 Cookies 已经过期了,那么接下里的请求将不再能访问需要登录后才能访问的页面。
所以, Session 和 Cookies 之间是需要相互配合的,一个在服务端,一个在客户端。
我们还是打开某东的网站,看下这些 Cookies到底有哪些内容:
[
](https://cdn.geekdigging.com/python-spider/jd-cookies.png)
具体操作方式还是在 Chrome 中按 F12 打开开发者工具,选择 Application 标签,点开 Cookies 这一栏。
那么有的网站为什么这次关闭了,下次打开的时候还是登录状态呢?
这就要说到 Cookie 的持久化了,其实也不能说是持久化,就是 Cookie 失效的时间设置的长一点,比如直接设置到 2099 年失效,这样,在浏览器关闭后,这个 Cookie 是会保存在我们的硬盘中的,下次打开浏览器,会再从我们的硬盘中将这个 Cookie 读取出来,用来维持用户的会话状态。
第二个问题产生了,服务端的会话也会无限的维持下去么,当然不会,这就要在 Cookie 和 Session 上做文章了, Cookie 中可以使用加密的方式将用户名记录下来,在下次将 Cookies 读取出来由请求发送到服务端后,服务端悄悄的自己创建一个用户已经登录的会话,这样我们在客户端看起来就好像这个登录会话是一直保持的。
import requests
session = requests.Session()
res = session.get(url = 'https://www.baidu.com/')
print(res.status_code)
from selenium import webdriver
bro = webdriver.Chrome()
url = 'https://www.jd.com/'
bro.get(url)
keys = bro.find_element_by_xpath('//*[@id="key"]')
keys.send_keys('iphone')
bro.find_element_by_xpath('//*[@id="search"]/div/div[2]/button/i').click()
time.sleep(2)
bro.close()
网站为了防止被爬取,会有反爬机制,对于同一个IP地址的大量同类型的访问,会封锁IP,过一段时间后,才能继续访问
网站为了防止被爬取,会有反爬机制,对于同一个IP地址的大量同类型的访问,会封锁IP,过一段时间后,才能继续访问。
import requests
from lxml import etree
url = 'https://www.xicidaili.com/nn/3'
headers = {
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'
}
res = requests.get(url=url, headers=headers)
res.encoding = 'utf-8'
tree = etree.HTML(res.text)
trs = tree.xpath('//table[@id="ip_list"]//tr')
http_lst = []
https_lst = []
for tr in trs[1:]:
ip = tr.xpath('./td[2]/text()')[0]
port = tr.xpath('./td[3]/text()')[0]
typ = tr.xpath('./td[6]/text()')[0]
if typ.lower() == 'http':
http_lst.append({'http':f'{typ.lower()}://{ip}:{port}'})
elif typ.lower() == 'https':
https_lst.append({'https':f'{typ.lower()}://{ip}:{port}'})
else:
continue
for i in (http_lst + https_lst):
print(i)
结果输出
{'http': 'http://211.142.169.4:808'}
{'http': 'http://115.219.105.229:8010'}
{'http': 'http://223.100.166.3:36945'}
{'http': 'http://121.237.148.82:3000'}
{'http': 'http://122.241.17.172:60004'}
{'http': 'http://122.241.34.188:60004'}
{'http': 'http://121.237.148.16:3000'}
{'http': 'http://121.237.149.50:3000'}
{'http': 'http://113.208.115.190:8118'}
{'http': 'http://125.126.122.44:60004'}
{'http': 'http://117.88.176.188:3000'}
{'http': 'http://117.88.177.244:3000'}
{'http': 'http://114.104.135.251:8888'}
{'http': 'http://223.241.117.210:8010'}
{'http': 'http://124.200.36.118:40188'}
{'http': 'http://115.219.105.158:8010'}
{'http': 'http://150.138.106.174:80'}
{'http': 'http://118.114.164.174:8118'}
{'http': 'http://125.126.114.7:60004'}
{'http': 'http://115.223.109.167:8010'}
{'http': 'http://115.223.96.231:8010'}
{'http': 'http://114.239.211.175:61234'}
{'http': 'http://27.43.188.66:9999'}
{'http': 'http://110.73.47.126:8123'}
{'http': 'http://171.35.173.121:9999'}
{'http': 'http://106.75.177.227:8111'}
{'http': 'http://115.223.94.243:8010'}
{'http': 'http://222.95.144.181:3000'}
{'http': 'http://222.95.241.80:3000'}
{'http': 'http://223.241.117.132:18118'}
{'http': 'http://117.88.5.19:3000'}
{'http': 'http://110.73.0.113:8123'}
{'http': 'http://202.115.142.147:9200'}
{'http': 'http://117.88.5.253:3000'}
{'http': 'http://115.219.104.57:8010'}
{'http': 'http://115.223.88.91:8010'}
{'http': 'http://121.237.149.165:3000'}
{'http': 'http://121.40.162.239:808'}
{'http': 'http://117.68.190.162:8118'}
{'http': 'http://113.194.31.60:9999'}
{'http': 'http://123.169.101.123:9999'}
{'http': 'http://115.223.108.111:8010'}
{'http': 'http://58.253.157.142:9999'}
{'http': 'http://60.173.241.77:8060'}
{'http': 'http://118.113.245.40:9999'}
{'http': 'http://113.124.92.200:9999'}
{'http': 'http://118.114.194.229:8118'}
{'http': 'http://140.250.197.186:9999'}
{'http': 'http://182.46.198.250:9999'}
{'https': 'https://223.241.116.161:8010'}
{'https': 'https://58.56.149.198:53281'}
{'https': 'https://117.45.139.84:9006'}
{'https': 'https://117.45.139.249:9006'}
{'https': 'https://221.1.200.242:38652'}
{'https': 'https://171.35.221.57:9999'}
{'https': 'https://122.241.32.63:60004'}
{'https': 'https://110.73.41.80:8123'}
{'https': 'https://120.79.61.114:80'}
{'https': 'https://222.95.144.23:3000'}
{'https': 'https://122.241.32.159:60004'}
{'https': 'https://122.14.47.21:8118'}
{'https': 'https://223.241.119.244:8010'}
{'https': 'https://116.113.27.170:47849'}
{'https': 'https://171.35.223.170:9999'}
{'https': 'https://144.52.243.32:9999'}
{'https': 'https://121.237.149.130:3000'}
{'https': 'https://110.243.9.72:9999'}
{'https': 'https://223.241.117.118:18118'}
{'https': 'https://121.237.149.108:3000'}
{'https': 'https://125.126.117.30:60004'}
{'https': 'https://125.126.109.112:60004'}
{'https': 'https://125.126.113.184:60004'}
{'https': 'https://115.219.107.158:8010'}
{'https': 'https://125.126.98.137:60004'}
{'https': 'https://125.126.107.48:60004'}
{'https': 'https://125.126.114.247:60004'}
{'https': 'https://111.231.239.143:1081'}
{'https': 'https://115.223.64.38:8010'}
{'https': 'https://210.5.10.87:53281'}
{'https': 'https://171.35.168.113:9999'}
{'https': 'https://117.88.4.162:3000'}
{'https': 'https://223.241.116.201:18118'}
{'https': 'https://117.88.4.242:3000'}
{'https': 'https://115.219.105.8:8010'}
{'https': 'https://171.35.170.144:9999'}
{'https': 'https://115.219.109.194:8010'}
{'https': 'https://120.39.216.129:808'}
{'https': 'https://115.223.68.95:8010'}
{'https': 'https://222.95.144.204:3000'}
{'https': 'https://121.33.220.158:808'}
{'https': 'https://175.148.79.80:1133'}
{'https': 'https://115.219.104.254:8010'}
{'https': 'https://163.204.244.185:9999'}
{'https': 'https://182.92.220.212:8080'}
{'https': 'https://117.88.4.160:3000'}
{'https': 'https://222.95.144.61:3000'}
{'https': 'https://117.88.4.253:3000'}
{'https': 'https://110.243.3.241:9999'}
{'https': 'https://117.88.4.23:3000'}
{'https': 'https://117.88.177.76:3000'}
from selenium import webdriver
from lxml import etree
import time
url = 'http://www.dxy.cn/bbs/thread/626626#626626'
bro = webdriver.Chrome()
bro.get(url)
# time.sleep(3)
bro.find_element_by_xpath('//*[@id="headerwarp"]/div[2]/div[1]/div/a[1]').click()
bro.find_element_by_xpath('/html/body/div[2]/div[2]/div[1]/a[2]').click()
bro.find_element_by_name('username').send_keys('username')
bro.find_element_by_class_name('input__btb1').send_keys('password')
bro.find_element_by_xpath('//*[@id="user"]/div[1]/div[3]/button').click()
input('请手动输入验证信息......')
time.sleep(5)
res = bro.page_source
print(res)
tree = etree.HTML(res)
divs = tree.xpath('//div[@class="postbox"]/div')
for div in divs:
auth = div.xpath('.//div[@class="auth"]/a/text()')[0]
content = div.xpath('.//td[@class="postbody"]')[0].xpath('string(.)').strip()
print(f'{auth}: {content}')
print('数据采集完成,5秒后将退出程序')
time.sleep(5)
bro.close()
结果输出
楼医生: 我遇到一个“怪”病人,向大家请教。她,42岁。反复惊吓后晕厥30余年。每次受响声惊吓后发生跌倒,短暂意识丧失。无逆行性遗忘,无抽搐,无口吐白沫,无大小便失禁。多次跌倒致外伤。婴儿时有惊厥史。入院查体无殊。ECG、24小时动态心电图无殊;头颅MRI示小软化灶;脑电图无殊。入院后有数次类似发作。请问该患者该做何诊断,还需做什么检查,治疗方案怎样?
lion000: 从发作的症状上比较符合血管迷走神经性晕厥,直立倾斜试验能协助诊断。在行直立倾斜实验前应该做常规的体格检查、ECG、UCG、holter和X-ray胸片除外器质性心脏病。贴一篇“口服氨酰心安和依那普利治疗血管迷走性晕厥的疗效观察”作者:林文华 任自文 丁燕生http://www.ccheart.com.cn/ccheart_site/Templates/jieru/200011/1-1.htm
xghrh: 同意lion000版主的观点:如果此患者随着年龄的增长,其发作频率逐渐减少且更加支持,不知此患者有无这一特点。入院后的HOLTER及血压监测对此患者只能是一种安慰性的检查,因在这些检查过程中患者发病的机会不是太大,当然不排除正好发作的情况。对此患者应常规作直立倾斜试验,如果没有诱发出,再考虑有无可能是其他原因所致的意识障碍,如室性心动过速等,但这需要电生理尤其是心腔内电生理的检查,毕竟是有一种创伤性方法。因在外地,下面一篇文章可能对您有助,请您自己查找一下。心理应激事件诱发血管迷走性晕厥1例 ,杨峻青、吴沃栋、张瑞云,中国神经精神疾病杂志, 2002 Vol.28 No.2
keys: 该例不排除精神因素导致的,因为每次均在受惊吓后出现。当然,在作出此诊断前,应完善相关检查,如头颅MIR(MRA),直立倾斜试验等。
楼医生: 谢谢上面几位的热心。这个病人从学会走路就出现症状,并且近几年发作越来越频繁,一个月有4、5次。如果说是血管迷走性晕厥,它的机理是什么?在这个病人身上如何解释?
shilly: 不会是心因性癫痫吧?我不是专科,猜猜
jrhs: 倾斜试验一定先排除器质性心脏病。
yangwein: 1,头颅MRI示小软化灶;脑电图无殊,惊吓后晕厥30余年,婴儿时有惊厥史。先做动态脑电图排查癫痫,还有视觉诱发试验等,请神经内科会诊。2,排除神经内科问题后,行直立倾斜实验筛查血管迷走神经性晕厥。彩超排除器质性心脏病。
duzl: 楼医生 如果说是血管迷走性晕厥,它的机理是什么?体位改变-血液下移-Bp、HR下降-晕厥
楼医生: 该患者直立倾斜试验阴性。UCG无殊。实在是个棘手的病人。下步诊断、治疗方案如何,请各位同仁指点。谢谢!
jrhs: 动态脑电图就能排除癫痫吗?我看不能,发作时有脑电图吗?
shanshoujie: 晕厥分类:心源性,非心源性,原因不明等三类,心源性包括心脏排血受阻,心律失常两类,非心源性包括血管神经运动失调性,脑血管疾病性,神经系统,代谢内分泌性等,所以常规检查包括心电图,超声心动图,CT,脑电图,24小时动态心电图,运动平板,心脏电生理等,但靠24小时动态心电图正常不能排除心律失常所致,必要时需要心电记录器延长监测,对于血管神经运动失调性及不明原因所致,建议行直立倾斜试验。
eabee: 问:这个病人智力有问题吗? 说她有30多年的发病史,多次发作时有外伤,问最严重的外伤情况如何?有无癔病的可能???说她婴儿时有惊厥史,说明她脑损伤病变的可能性存在,可能脑病变本身存在,也可能是惊厥后导致脑损伤。1)试用抗癫痫药物治疗,可以考虑用比较缓和的药物尝试。2)检测脑血管情况,实验用钙拮抗剂,或其他扩血管药物。
xghrh: 希望下面的流程图对您的下步诊治有帮助。
楼医生: 问:这个病人智力有问题吗? 说她有30多年的发病史,多次发作时有外伤,问最严重的外伤情况如何?有无癔病的可能???说她婴儿时有惊厥史,说明她脑损伤病变的可能性存在,可能脑病变本身存在,也可能是惊厥后导致脑损伤。1)试用抗癫痫药物治疗,可以考虑用比较缓和的药物尝试。2)检测脑血管情况,实验用钙拮抗剂,或其他扩血管药物。 该患者智力正常,已结婚生子。最严重的外伤是跌倒致脑出血,还有数次骨折、颜面部外伤,门牙跌落数枚。基本排除癔病可能。
雨叶: 我认为这个病人可能是癫痫,应该发作时做脑电图
mmdra: Hehe! LQTs!!!
daeik: 晕厥之前是否有出汗、恶心、脸色苍白等症状?晕厥持续时间?除考虑血管迷走性晕厥之外,癔病也不能除外。
小贤: 每次晕厥后意识马上恢复,神志清楚,则考虑心血管原性可能大晕厥后意识恢复慢,有嗜睡,则中枢性可能大此患者意识恢复是否很快
RonnieWhite: LQT
shunwee: 从病史看及发作情形看恶性心律失常所致晕厥可能性不大,鄙人认为不典型癫痫可能性较大,但也应排除迷走性晕厥,直立倾斜可以做但阳性并不能排除癫痫。可考虑用卡马西平试验性治疗。
Edmond: 楼医生 该患者直立倾斜试验阴性。UCG无殊。实在是个棘手的病人。下步诊断、治疗方案如何,请各位同仁指点。谢谢!楼医生,估计是查不出什么问题的,因为已经都快30多年的病史了,该有的疾病应该现出原形了,而现在却恰恰没法子找到它。既然都检查过了,也没发现有价值得的东西,而且每次发作多因惊吓引起,你看,是否就试一试“惊吓”的方法来诱发它呢?诱发的时候可以心电监护、血压监护、脑电图监测等等,相信肯定有所发现的。这也是不是办法的办法,您说呢?
紫薇1219: 我认为癫痫的可能性最大,但的确应该先排除心源性的,可以进一步查一下。
lingguang: 同志们呀,我认为是不是考虑一下先天性长QT综合征?这种病人可是会因为受惊吓导致晕厥甚至致死的呀!
lingguang: 应当是一种肾上腺依赖性的,在受惊吓时肾上腺素大幅度升高,出现恶性心律失常而致晕厥。我不知道当时HOLTER检查时有没有发作?当时若有发作时的心电图最有说服力。我认为应当排除这方面的情况。必要的时候作惊吓试验,当然现场要有心电监护以及抢救措施。
呆子: 考虑为癫痫,建议动态脑电图,若阴性。则试用抗癫痫药
lingguang: 应当做惊吓试验,脑电图与心电图同时监测。我想肯定会有结果的。无非是两种情况:脑源性与心源性。
数据采集完成,5秒后将退出程序