以下是个人对正则匹配、爬虫的一点学习心得,分享给大家,相互学习,有错误请指出,谢谢!
如果用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)