爬虫(04)cookie+session+正则+字典快速生成2020-12-18

编程入门 行业动态 更新时间:2024-10-26 13:24:29

文章目录

  • 第四章 cookie与session正则字典快速生成
    • 1. 小知识点:字典快速生成
    • 2. cookie初识
      • 2.1 反爬
      • 2.2 模拟登录
      • 2.3 处理不信任的SSL证书
    • 3. session
    • 4. 正则表达式
      • 4.1 re模块的使用

第四章 cookie与session正则字典快速生成

1. 小知识点:字典快速生成

当我们在定制headers的时候,会有大量的数据需要转化为键值对,给每对数据加上引号,手动操作很慢,这里我们可以用一个正则的方法快速操作。

(.*?):(.*)
'$1':'$2',

这是正则表达式,选中所有要加引号的内容,按住Ctrl+r调出命令输入口,依次输入上面的正则表达式,再点Replace all

2. cookie初识

cookie: 通过在客户端记录的信息确定用户身份。
HTTP是一种无连结协议,客户端和服务器的交流仅限于请求与响应的过程,结束后就断开,下一次请求时,服务器会认为是一个新的客户端。为了维护他们之间的连结,让服务器知道,这是前一个用户发起的请求,必须在一个地方保留客户端信息。

2.1 反爬

cookie的作用就是把服务器里面记录的客户端的信息提供给服务器,让它“认得”我们。下面通过一个实例来展示它的作用。
实例:我们常用的某网站,我们的目标是爬取我们要的一个票的信息。

我想获取这个网站的源代码,并从中找到k2046。常规代码是这样的:

# 1*2*3*0*6案例
import requests
url = 'https://kyfw.12306/otn/leftTicket/init?linktypeid=dc&fs=%E8%A5%BF%E5%AE%89,XAY&ts=%E9%83%91%E5%B7%9E,ZZF&date=2020-12-18&flag=N,N,Y'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36'}
res = requests.get(url,headers=headers)
res = res.content.decode('utf-8')
with open(r'D:\spiderdocuments\demo_12306_01.txt','w',encoding='utf-8') as f:
    f.write(res)
print('写入成功!')

为了方便查找,我将获取到的源码写入了一个名为“demo_12306_01.txt”的文本文档里面。程序执行后,我在相应的路径里找到了该文件:

打开输入查找内容:

结果却显示找不到我们要的内容,这是怎么回事呢?不再啰嗦,这是因为该网站采用了异步加载的功能,ajax技术,这个大家自己百度。就是在网页不整体更新的情况下,加载更新网页的部分内容。下面我进行如下操作:

  • 再次打开该网页
  • 检查》源代码》network》清空》点网页上的“查询”


    在这个名为query的加载项里就有我们想要的目标。如果我们要获得这个项目里的数据,就需要相应的cookie,看后面的cookie。

    将cookie复制下来,写入headers里面,当作第二个键值对。于是代码做如下更新:
import requests
url = 'https://kyfw.12306/otn/leftTicket/query?leftTicketDTO.train_date=2020-12-18&leftTicketDTO.from_station=XAY&leftTicketDTO.to_station=ZZF&purpose_codes=ADULT'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36','Cookie':'_uab_collina=160826769442998245066666; JSESSIONID=B21301DF6D2092E7210BBD3B95BDA11A; BIGipServerotn=519045642.24610.0000; BIGipServerpool_passport=182714890.50215.0000; RAIL_EXPIRATION=1608552687796; RAIL_DEVICEID=tqskFs_9UsP7WvMGE5poawfYGk8OId5QoPfIujkwjW_FnI618H4twH6MVOE3CITJRkShYWBtKeuGTYwgCR2nNPsdtjfp0r1mZXBBFyM_UyIZImC9Z9jHWxmhLPVQiiAgr6hbsrepFGT1jA3rM_NUWwC_Ei6hyQbf; route=495c805987d0f5c8c84b14f60212447d; _jc_save_fromStation=%u897F%u5B89%2CXAY; _jc_save_toStation=%u90D1%u5DDE%2CZZF; _jc_save_fromDate=2020-12-18; _jc_save_toDate=2020-12-18; _jc_save_wfdc_flag=dc'}
res = requests.get(url,headers=headers)
res = res.content.decode('utf-8')
with open(r'D:\spiderdocuments\demo_12306_02.txt','w',encoding='utf-8') as f:
    f.write(res)
print('demo_02写入成功!')

执行结果显示如下:

demo_02写入成功!

输入要查找的内容,结果就看到我们要的数据在里面。这是cookie反爬的一个简单的应用。

鲜花送给我的老师。

2.2 模拟登录

cookie的另一个应用是模拟登录。模拟登录有两种方式,一种是添加cookie,另一种是将账号密码通过post请求提交。
我们下面模拟登录一下知乎的主页。
先注册然后手动登录一下知乎。
如果我们只把此时地址栏的url复制来了,然后发送请求的话,是不能进入主页面的,只会重定向到登录页面,我们试一下:

import requests
url = 'https://www.zhihu/'
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36'}
req = requests.get(url,headers=headers)
print(req.text)

执行结果

<div class="SignFlow-tab SignFlow-tab--active">免密码登录</div><div class="SignFlow-tab">密码登录</div><div

我们看到抓取的代码中出现了”免密码登录“/”密码登录“的字样,说明,确实在登录界面。现在我们加上cookie。在进入主页面后,右键点检查,然后找到network并点击,然后刷新一下页面。在network中会加载很多的内容,点击第一项,并找到Requests headers>cookie复制内容,添加到headers里。代码如下:

import requests
url = 'https://www.zhihu/'
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36',
'cookie':'_zap=436b0654-3d8a-4a67-baf9-98585233a1d3; _xsrf=U4KC0Fppxem6A4bDDrSNab6qp0rG6OUN; d_c0="AMCbV30UYRKPTpi4Qa2AE7vQGkPEjFvmDDc=|1608532576"; l_n_c=1; r_cap_id="MjYwNWEzYzc2NzYxNGZmN2FlOThjZWMyNGFiYWJmOWY=|1608532724|4613acbfabcd5a91d604f7f5c106e108e5ba497a"; cap_id="ZmJlYmVhYmYxMGYwNGE5Y2JiMzE1ZWExOTgwNjZjMGM=|1608532724|18dcc31cab4b6cd47c76c3fa360d6edcba174da8"; l_cap_id="MzcxZjE3Mzg0MmIyNDc5YmEwZTljNzUzMzUwOTVmODc=|1608532724|239901bc9f51deb8faebb6a660145b4d51864b50"; capsion_ticket="2|1:0|10:1608532742|14:capsion_ticket|44:ODcwM2YxYTBjNDEwNDVjMjhkODcxMjdmYmYxMTczN2I=|d723dbc4f87635c9d35aba3d14b255e0f65f6fd63951c0435742db4b1391da7f"; auth_type=d2VjaGF0|1608532764|5a649bb1e41b3029f7ca3bba7b50ce6161d0d761; atoken=40_TyQMW6Jv-BA1m91avq-pTpCRA_SWjZ7zHl0S_1gLoodD7r3iJm1Ty4nbjqehDHaTLGaLJWxkSNkAZw0TXsgAkBB45qKsJeZT9Sl7xA0Pedc; atoken_expired_in=7200; token="NDBfVHlRTVc2SnYtQkExbTkxYXZxLXBUcENSQV9TV2paN3pIbDBTXzFnTG9vZEQ3cjNpSm0xVHk0bmJqcWVoREhhVExHYUxKV3hrU05rQVp3MFRYc2dBa0JCNDVxS3NKZVpUOVNsN3hBMFBlZGM=|1608532764|faf68abde0b8a5c8931afc23e21983c446c27d4a"; client_id="bzNwMi1qZ0NaaWRURmc2bmV4OVRLc2VwY0diTQ==|1608532764|4cdc1b11efcb91221f44dc05009ad2e4fb147250"; n_c=1; z_c0="2|1:0|10:1608532814|4:z_c0|92:Mi4xZ1ZCNUdnQUFBQUFBd0p0WGZSUmhFaVlBQUFCZ0FsVk5UcEhOWUFEZHdnbVpGcW9wa3lTcWp1a3BjbGdjT2F5UE9n|eb5dd09eb90ca5300df8467788c229558154263ffd0a796ac6d290ff11c6e08e"; unlock_ticket="ABDVPdO7GBEmAAAAYAJVTVZK4F99XOB6IKao9c7JUWsYhRlrk5Op7w=="; tst=r; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1608532581; KLBRSID=9d75f80756f65c61b0a50d80b4ca9b13|1608533853|1608532574'
# referer:https://www.zhihu/signup?next=%2F
           }
req = requests.get(url,headers=headers)
print(req.text)

执行结果

<!doctype html>
<html lang="zh" data-hairline="true" data-theme="light"><head><meta charSet="utf-8"/><title data-react-helmet="true">首页 - 知乎</title><meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1"/><meta name="renderer" content="webkit"/><meta name="force-rendering" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/><meta name="google-site-verification" content="FTeR0c8arOPKh8c5DYh_9uu98_zJbaWw53J-Sch9MTg"/><meta name="description" property="og:description" content="有问题,上知乎。知乎,可信赖的问答社区,以让每个人高效获得可信赖的解答为使命。知乎凭借认真、专业和友善的社区氛围,结构化、易获得的优质内容,基于问答的内容生产方式和独特的社区机制,吸引、聚集了各行各业中大量的亲历者、内行人、领域专家、领域爱好者,将高质量的内容透过人的节点来成规模地生产和分享。用户通过问答等交流方式建立信任和连接,打造和提升个人影响力,并发现、获得新机会。"/><
... ...

这次我们发现抓取到的数据明显增多,而且出现了”首页-知乎”,说明进入了主页。这是cookie的第二个应用,模拟登录。

2.3 处理不信任的SSL证书

SSL证书是数字证书的一种,类似于驾驶证,营业执照,护照等证书的电子副本。因为配置在服务器上,因此也成为ssl服务器证书。ssl证书就是遵守ssl协议,有数字证书办法机构CA在验证服务器身份后颁发。具有服务器身份验证和数据传输加密功能。
我们打开国家增值税查验平台这个网站:

我们可以看到出现证书错误的问题,如果我们相应请求这个网站的数据,就会报错。我们试一下:

# 处理SSL证书报错问题
import requests
url = 'https://inv-veri.chinatax.gov/'
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36'}
res = requests.get(url,headers=headers)
print(res.text)

执行结果


(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed:

我们看到报错,上面是我截取的报错的部分信息。其中有“verify failed”的字眼。
我们可以这样处理一下代码就可以了。在请求代码里面加入“verify = false”,就是不需要验证的意思。

# 处理SSL证书报错问题
import requests
url = 'https://inv-veri.chinatax.gov/'
headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36'}
res = requests.get(url,headers=headers,verify=False)
print(res.text)

执行结果

D:\Python38\lib\site-packages\urllib3\connectionpool.py:981: InsecureRequestWarning: Unverified HTTPS request is being made to host 'inv-veri.chinatax.gov'. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  warnings.warn(
<!DOCTYPE html>
<html xmlns="http://www.w3/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <title>国家税务总局å
¨å›½å¢žå€¼ç¨Žå‘票查验平台</title>
    <meta name="keywords" content="">

这一次我们发现拿到了数据。

3. session

通过在服务端记录的信息来确认用户的身份,目的是保持会话。我们通过登录某网站来认识该知识点。

这是某著名网站,登录时有图片验证的程序我们如何通过程序来实现呢?
这里有三个需要提交的内容:账号,密码,验证码
我们假设账号都正确,那么会出现以下四种结果:

  • 密码正确 验证错误
  • 密码错误 验证正确
  • 密码错误 验证错误
  • 密码正确 验证正确
    经过测试我们知道,这个网站第一步先看验证码,如果验证码错误,其他的数据根本不会看。验证正确了,才会去看账号和密码。如果验证码正确,在network里面会多出一个login的数据。(待续)

4. 正则表达式

正则表达式是对字符串的一种逻辑操作方式,就是用事先定义好的一些特定字符,及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。作用有两个:

4.1 re模块的使用

re.match(pattern,string,flags=0)

pattern: 正则表达式的模板
string: 要匹配的字符串
flags: 标志位 用于控制正则表达式的匹配方式 例如,是否区分大小写,例如是否多行匹配 默认为零。
案例:我用来匹配一个字符串。

import re
s = 'python and java'
pattern = 'python'
res = re.match(pattern,s)
if res:
    print(res.group())
    print(res.start())
    print(res.end())
    print(res.span())
else:
    print('没有匹配到')

执行结果

python
0
6
(0, 6)

这块知识,我们暂时先简介到这里,下节我们再详细的讲述。

更多推荐

爬虫(04)cookie+session+正则+字典快速生成2020-12-18

本文发布于:2023-06-14 08:47:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1457941.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:爬虫   正则   字典   快速   cookie

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!