最近小爬了某个实时更新的网页,在此期间印象比较深刻的有两个地方(解决方法和以往不同)。因为不太常用这些,希望能有更好的解决方法。
替换成当天时间
思路:需要根据当前时间日期来替换URL中的特定部分。
像平常爬的网站都有固定的格式,只需更改类似 page
后的值即可请求到相对应的页面。而这个网站挺有意思的是它页面结尾是以当前日期的 年/月/日/时.html
显示,且每一个小时更新一次。
例如当前网站:https://www.just1n.cn/2023/07/27/10.html
,我们可以使用datetime
模块来用本地时间计算出这个特定部分。
import requests
import datetime
# 这里的 rd.random_UA 已提前封装
headers = rd.random_UA() # 随机UA
nowtime = datetime.datetime.now().strftime('%Y/%m/%d/%H')
request = requests.get(f"https://www.just1n.cn/{nowtime}.html", headers=headers)
上述代码中函数 strftime
可以实现本地时间\日期的格式化(将任意格式的日期字符串按要求进行格式化),返回以可读字符串表示的当地时间,格式由参数 format 决定。常见控制字符符号如下:
格式符号 | 描述 |
---|---|
%y | 两个数字表示的年份 23 |
%Y | 四个数字的年份表示 2023 |
%m | 返回月份 范围 [0,12] |
%M | 返回分钟数 范围 [0,59] |
%d | 返回的是当前时间是当前月的第几天 范围 [0,31] |
%H | 以24小时制表示当前小时 |
%I | 以12小时制表示当前小时 |
%M | 返回分钟数 范围 [0,59] |
%S | 返回秒数 范围 [0,59] |
%P | 返回是上午还是下午–AM or PM |
正则提取中间内容
思路:指定起始字符串和结束字符串提取中间内容,不包含始末字符串
HTML元素的定位本来是可以采用很多常见的方式的,如CSS、XPath等。因为没尝试用正则做过,所以尝试一下,但结果差强人意——有些特殊的标记还要再次进行分割删除。可能还是技术不到家 T_T
import re
# 通过上述代码得到
html = request.text
# START_STR:起始字符串,END_STR:结束字符串
content = re.findall('(?<=START_STR).*?(?=END_STR)', str(html))
将上述代码中起始和结束字符串替换即可使用,需要注意的是逗号后面的参数一定要是字符串类型。