Python爬虫常用正则表达式大全
我跟你讲啊,我前几天在咖啡店坐那写爬虫代码,旁边坐个妹子一直在看剧,结果她每次切换下一集那个请求我都能抓到,笑死我了……不过也好,正好趁机把我常用的那些正则又捋了一遍,刚好你要这个主题,那就随便聊聊,顺便把代码也贴一贴,别太形式主义,咱就讲点实用的。
我为大家打造了一份RPA教程, 完全免费: https://www.songshuhezi.com/rpa.html 🔥 虎哥私藏精品 🔥 虎哥作为一名老码农,整理了全网最全 《python高级架构师资料合集》 ,总量高达 650GB , 点击下方公众号回复关键字 python 全部 免费领
正则用在哪儿最爽
你知道吧,其实你写 Python 爬虫,大头基本都在两个地儿,一个是搞请求的 header、cookie 之类的,还有一个就是从乱七八糟的 HTML、JS 里把你想要的那点数据扒出来。前者吧还好说,后者不用正则基本你就废了,尤其那种页面 source code 里塞了一堆 JSON 或者 inline script 的,常规的
xpath
根本动不了它。
提取标签里的内容
最基本的,提标签文本,这种:import re
html = '<div class="user">张三</div>'
res = re.findall(r'<div class="user">(.*?)</div>', html)
print(res) # ['张三']
这里我跟你讲千万别写
.*
,你写
.*
它会贪婪地吃掉所有
<div>
到最后一个
</div>
之间的内容,那你就麻了,
.*?
才是懒惰匹配,这个点超级关键。
抓 ID、链接那种属性的值
比如你在页面里看到一个
<a href="/user/12345">
,你就想抓那个 12345。这个时候:
url = '<a href="/user/12345">个人页</a>'
uid = re.findall(r'href="/user/(\d+)"', url)
print(uid) # ['12345']
这里注意了,
\d+
是数字串,如果那链接不是纯数字,你用
[\w-]+
会更保险,支持下划线、短横线那种也能抓。
从脚本里抓 JSON 或变量
像你抓微博、知乎那种,有的页面根本没有你要的数据,得从
<script>
里扒。比如这样:
script = '<script>var data = {"name": "李四", "age": 30};</script>'
json_str = re.findall(r'var data = ({.*?});', script)
print(json_str) # ['{"name": "李四", "age": 30}']
这个用
{.*?}
很好使,但你碰到嵌套 JSON 就完蛋了,这时候还是建议你配合
json.loads()
去转成字典,别死磕正则。
手机号、邮箱啥的验证和提取
你知道那个谁吗?就我们测试组那小哥,前几天提了个任务让我抓用户反馈里的手机号和邮箱,其实用正则特方便:text = '请联系我:13800138000 或 [email protected]'
phones = re.findall(r'1[3-9]\d{9}', text)
emails = re.findall(r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+', text)
print(phones, emails)
这里我不吹,那个手机号规则基本是国内通用的,邮箱的话再复杂你可能得调库了,正则再写就过于硬核了。
页面中的 JS 动态变量
有些页面没接口,变量全写在 JavaScript 里,比如:script = 'window.__DATA__ = {"token": "abc123xyz"}'
token = re.findall(r'"token":\s*"(.+?)"', script)
print(token) # ['abc123xyz']
这种你是不是也常见?而且你别用
[^"]+
来匹配字符串,变量有时候还真包含引号,还是
.+?
稳。
多个值一起提,配合 groups
你看这种场景我特别常用,抓商品名和价格:html = '<li><span class="name">苹果</span><span class="price">¥5.00</span></li>'
items = re.findall(r'<span class="name">(.*?)</span><span class="price">¥(.*?)</span>', html)
print(items) # [('苹果', '5.00')]
别小看这种两个字段一块提出来,真比你两次
findall
再对 index 靠谱多了,结构稳定还好维护。
替换内容
最后我说一个平时清洗数据时候经常干的,就是
re.sub
:
dirty = '价格:¥5000元'
clean = re.sub(r'[^\d]', '', dirty)
print(clean) # '5000'
就这句,我写爬淘系的时候用得不要太多,搞那种“¥899元包邮”之类的描述,通通洗成纯数字,直接丢数据库。
差不多就这些吧,场景一说你肯定懂,其实很多时候不是你不会写,而是你不知道什么时候正则比
xpath
好使。再说了正则也不是越复杂越牛,能用三五个字符解决问题的,别硬拽个一屏幕的写法,看着都晕。
哎,对了,等会儿我要去帮隔壁运维看个日志,里面一堆
Error:
和
Traceback
,也是正则搞定,我回头要不把那脚本也贴出来你看?
-END
-
我为大家打造了一份RPA教程, 完全免费: https://www.songshuhezi.com/rpa.html 🔥 虎哥私藏精品 🔥 虎哥作为一名老码农,整理了全网最全 《python高级架构师资料合集》 ,总量高达 650GB , 点击下方公众号回复关键字 python 全部 免费领