Re正则匹配和Python初级爬虫学习心得

以下是个人对正则匹配、爬虫的一点学习心得,分享给大家,相互学习,有错误请指出,谢谢!

如果用Python写爬虫的话,正则匹配在re包里面,然后一般也需要用到urllib2(网络请求响应),BeautifulSoup(响应内容解析),当然也有Scrap框架,也支持Python3.6了,这个方法对静态页面爬取没有问题;

如果是爬取需要登录的页面,需要先准备一个cookie(作用类似通行证,让服务器知道你之前来过,就不在阻止你了);为了防止网站拒绝服务(单位时间响应次数过多对会服务器造成很大压力);你可能需要一些代理伪装加在url前面,降低单位时间内访问次数

针对动态页面爬取,Python有一个selenium,通过模拟手动刷新,爬取你需要获取的内容。但是,爬虫并不这么简单,这可能只是入门,因为很多大型网站会反爬虫,所以对此有兴趣的还需要更深一步研究;获取的数据处理也是一个很艰难的问题!特别是文字处理这一块,有心得的同学一起多交流!

正则匹配不难,但是在哪里都要用,爬虫、前端、Linux shell等等;最后贴个Python urllib爬虫的例子;希望帮助理解,代码已经封装成了模块,可以直接拿去用,按需求改一下匹配条件即可,然后import的时候,报错的话,那么需要放到anaconda3 Lib路径下面去,具体如何操作可以百度一下。

用正则匹配的时间,尤其是在Web开发,特别要留心的是回溯引用,这个很可能就导致CPU占用过多,使得服务器崩溃,类似的案例网上很多,也有相关的处理方法;

.  表示匹配任意一个字符(除换行符以外);  a.可匹配 aa.xls;

\. 表示对.进行转义, .就表示自身的意思,\表示转义字符,对任何一个元字符都能进行转义,倘若要匹配其本身,就是\\;

[] 字符集合,只匹配集合中出现的字符;

()子表达式,可以将重复数据,封装成一个()模块,然后再用{1,3}一起匹配,{1,3}表示匹配的字符,最少出现一次,最大出现3次;称之为重复区间,下文也有提到;

︱ 或操作,把左边或者右边当做整体看待;

-:连字符 表示连续的字母或者数字,如:[ns]a[0-9]\.xls  其中[A-z]是ASICS 码匹配,切记避免匹配区间末字符大于首字符,如果-在[]之外,不需要使用转义;

倘若在开始添加一个#字符,即从开始的#开始匹配,换言之,也就是特定字符的匹配;

元字符^:表示取非匹配,作用效果于给定的字符集合中[]内;

\f 匹配换页符  \n 换行符  \r 回车符 \t 制表符(tab) \v 垂直制表符  [\b]回退符,backspace键;

\d 匹配任何一个数字  \D 匹配任何一个非数字;

\w 匹配任何一个字母与数字或下划线   \W与之相反;

\s 匹配空白符   \S匹配任何一个非空白符;

\1回溯引用,数字代表前面的子表达式是第几个,并且匹配前者子表达式中出现的相同的元素

+ 表示匹配连续出现的同样字符或者字符集合,a+ 匹配多个连续的a,[0-9+]中的+为特定字符,至少要匹配一次

* 表示匹配连续字符,但是匹配的次数可以是0次,与+的唯一差别

? 只能匹配一个字符或者字符集合的零次或者一次

{} 定义匹配的重复次数 {3}表示前面的字符集合连续出现3次才算是一个匹配; {2,4}设置重复次数区间
{3,} 至少匹配3次

懒惰型匹配方法,即在原先的基础之上增加一个? 就可以;

\b 用来匹配一个位置,且这个位置是位于能构成和不能构成单词的中间

\B 用来匹配一个前后都不是单词的连字符  

^定义字符串开头,$定义字符串的结尾 
?m 必须放最开始,并且^将可以匹配换行的字符,$将可以换行的结尾;  

$1 代表前面匹配好了的回溯引用;其中数字表示是对第几个子表达式进行运用回溯引用

大小写转换:
\E 结束\L或\U转换
\l 把下一个字符转换成小写
\L 把\L到\E之间的字符全部换成小写
\u 把下一个字符换成大写

\U 把\U到\E之间的字符全部转换成大写

javascript不支持向后查找
?=向前查找,需要查找的内容跟在=的后面;因此可以用来匹配符号前面的元素。

?<=向后查找

import re
import urllib.parse
import urllib.request
from bs4 import Beautifulsoup

def extra_data(url):
    web = urllib.request.urlopen(url)
    
    data_info = web.read()
    
    data_info = data_info.decode("utf-8")
    
    data_id = re.compile(r'user_id":\d{10}')
    user_str = str(data_id.findall(data_info))
    
    user_need = re.compile(r'\d+')  #改匹配条件,匹配你自己所需要的数据
    user_id = user_need.findall(user_str)
    if  len(user_id) == 0:
        user_id = -1
    
    else:
        user_id = user_id[0]
    
    gender_str = re.compile(r'gender":"\d{0,2}') #改匹配条件,匹配你自己所需要的数据
    gender_data = str(gender_str.findall((data_info)))
    gender_need = re.compile(r'\d+')
    gender = gender_need.findall(gender_data)
    if len(gender) == 0:
        gender = -1
    else:
        gender = gender[0]
    
    birthday_str = re.compile(r'birthday":"\d{0,20}')  #改匹配条件,匹配你自己所需要的数据

    birthday_data = str(birthday_str.findall((data_info)))
    
    birthday_need = re.compile(r'\d+')  
    birthday = birthday_need.findall(birthday_data)
    if len(birthday) == 0:
        birthday = -1
        
    else:
        birthday = birthday[0]
    
    return user_id,gender,birthday


if __name__ == '__main__':
    extra_data(url)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值