前言叨逼叨
在某培训机构的客服网站看到一篇爬取12306数据的博客,甚是欣喜,但是在实际操作中,有好多的关键点并未给出,比如对站名的中文与英文标示符的转换等等,甚至我一度想利用一些汉子转拼音的框架自己手撸,但是看连接中标识站名的英文参数并不是简单拼音开头字母缩写,而是有一些特定的规则,但是这样的文章在简书上竟有300喜欢,我就放弃了
转机
后来在不死心简书上看到另外一篇文章,感觉要全面的多,但是只有区区十几个赞,深感不公,建议大家看下,链接在此
正题
啰嗦了一堆,进入正题,博客大家自己看下,本篇文章主要是介绍在这篇文章中学到的,以及由这篇文章引起的一些知识
- HTTPS
现在好多的网站的url都使用了HTTPS,包括12306,当使用request
库进行网络请求的时候会报类似下面的
# Fails: requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)
百度和谷歌了好多,答案不是很多,大多数答案为
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
但是在此项目中并不生效,后来机缘巧合的,在request请求参数的时候,添加以下参数
response = requests.get(url, verify=False)
verify=False
简单理解为不去验证HTTPS的请求的真实性,以目前的知识就只能理解到这一层
- 正则
看过刚才推荐的博客就知道了在网络请求会将站名的汉字转为英文标识符,这个中英文对照表是通过另外一个网络请求获取的,获取内容格式大致如下
经过观察一个完整的站名大致四这样的格式:
@站名小写字母|站名汉字|站名网络请求字母表示|站名小写字母
我们需要的格式正好是中间的一部分,即
站名汉字|站名网络请求字母表示
,正则为
([\u4e00-\u9fa5]+)\|([A-Z]+)
这里对正则做下解释
-
()
小括号是需要提取的信息 -
\u4e00-\u9fa5
通过Unicode编码的范围去锁定汉字的范围,汉字的Unicode的范围可以在网上查到 -
[A-Z]
大写字母的范围 -
+
至少出现一次 - re 模块
findall
找出所有符合的数据,返回一个数组,返回格式如下
网友评论