经过Python学习之路-1,学习了Python的基础语法,加上用os模块写了一些代替批处理的文件管理工具,这次打算依葫芦画瓢,写一个爬虫(以前用java写过,据说python写起来很爽啊)
这次的参考博客是:Python爬虫入门
一、简单爬虫爬取网页数据:
values ={{"name":"li"}};
urllib.urlencode(values); #1.设置post表单值(要URL编码)
headers={"user-agent":"xxx"}; #2.Headers值(User-Agent标示浏览器、
req = urllib2.Request(url,requestData,headers)#3.构造Rquest
resp = urllib2.urlopen(request/url )#4.发送请求,拿到response对象:
data = resp.read() #5.然后通过read()拿到数据
二、解析数据
爬出了数据,那么下一步就是解析数据,拿到自己想要的内容,有专门的html分析工具,也可以用正则表达式。正则表达式语法就不说了,着重提一下分组和贪婪:
分组: 整个regex表达式为第0组,从左到右,第几个“(”就为第几个分组
例子: “(123)”:第0分组,第1分组 匹配的都是”123”.
\{num} #代表取第num个分组的值
贪婪匹配: 4个量词
“{m,n}”:匹配m~n次
“*”:代表匹配>=0次
“+”:代表>=1次
“?”:代表匹配0或1次
默认都是贪婪的,尽可能多的匹配,量词后面加”?”代表非贪婪模式
例子:”\d{3,5}?” :尽可能的匹配3次
简单使用regex 匹配数据:
regex = "<a(.*) href=(.*?) (.*)>" #正则表达式,用来拿到超链接地址
pattern = re.compile(regex); #pattern一定要先compile()
resultObject = re.match(pattern,data);
#match以0位置开始匹配,若匹配失败,则返回None
srcs = resultObject.group(2);
match的另一种写法:resultObject = pattern.match(data);
re.compile(string[,flag]),其中flag是匹配模式,可同时生效,比如re.I | re.M。
• re.I: 忽略大小写,(全拼:IGNORECASE)(括号内是完整写法,下同)
• re.M: 多行模式,改变'^'和'$'的行为,(全拼:MULTILINE)
• re.S: 点任意匹配模式,改变'.'的行为,(全拼:DOTALL)
• re.L: 使\w\W\b\B\s\S,取决于当前区域设定,(全拼:LOCALE)
• re.U: 使\w\W\b\B\s\S\d\D,取决于unicode定义的字符属性,(全拼:UNICODE)
• re.X: 详细模式。这个模式下正则表达式可以是多行,忽略空白字符,并可以加入注释。(全拼:VERBOSE)
以下为匹配所用函数
re.match(pattern, string[, flags]);#只在0位置开始匹配
re.search(pattern, string[, flags]);#全局匹配
re.split(pattern, string[, maxsplit])#将string分割后返回列表
re.findall(pattern, string[, flags])#以列表形式返回全部能匹配的子串
re.finditer(pattern, string[, flags])#返回顺序Match对象的迭代器
re.sub(pattern, newstring, string[, count])#替换匹配到的字符串
re.subn(pattern, newstring, string[, count])#返回替换次数count
resultObject(match对象)是一次匹配的结果,包含了很多关于此次匹配的信息
Mathch对象的属性:
1.string: 匹配时使用的文本。
2.re: 匹配时使用的Pattern对象。
3.pos: 文本中正则表达式开始搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
4.endpos: 文本中正则表达式结束搜索的索引。值与Pattern.match()和Pattern.seach()方法的同名参数相同。
5.lastindex: 最后一个被捕获的分组在文本中的索引。如果没有被捕获的分组,将为None。
6.lastgroup: 最后一个被捕获的分组的别名。如果这个分组没有别名或者没有被捕获的分组,将为None。
Mathch对象的方法:
1.group(num=0):
获得一个或多个分组截获的字符串;指定多个参数时将以元组形式返回。group1可以使用编号也可以使用别名;编号0代表整个匹配的子串;没有截获字符串的组返回None;截获了多次的组返回最后一次截获的子串。
2.groups(default=None):
以元组形式返回全部分组截获的字符串。相当于调用group(1,2,…last)。default表示没有截获字符串的组以这个值替代,默认为None。
3.groupdict(default=None):
返回以有别名的组的别名为键、以该组截获的子串为值的字典,没有别名的组不包含在内。default含义同上。
4.start(group=0):
返回指定的组匹配的子串,在原string中的开始位置(子串第一个字符的索引)。注意索引是从0开始的
5.end(group=0):
返回指定的组匹配的子串,在原string中的结束位置(子串最后一个字符的索引+1)。
6.span(group=0): 返回匹配区间[start,end]。
7.expand(template): 以指定格式返回匹配到的字符串
temolate: 以 \num 、\g<num> 、\g<name> 引用分组
这里的"\"要转义: "\\2" 、"\\g<2>"