首页 > 其他 > 详细

正则表达式

时间:2017-02-14 17:46:22      阅读:301      评论:0      收藏:0      [点我收藏+]

正则表达式符号与方法:

1 import re
2 secret = "1232354xxYouxx1231xxandxx120938xxmexx123412"
3 b = re.findall("xx.*xx",secret)
4 c = re.findall("xx.*?xx",secret)

.* 典型的贪心算法,也就是匹配尽可能多的[‘xxYouxx1231xxandxx120938xxmexx‘]

.*? 非贪心算法,每一项少但是匹配多个[‘xxYouxx‘, ‘xxandxx‘, ‘xxmexx‘]

     同时也是匹配任何字符

 

(.*?)返回括号内的内容[‘You‘, ‘and‘, ‘me‘]

 

serch和findall区别:

1 s2 = "asdfxxIxx123xxlovexx"
2 q = re.search("xx(.*?)xx123xx(.*?)xx",s2).group(2)
3 p = re.findall("xx(.*?)xx123xx(.*?)xx",s2)
4 print(q)
5 print(p[0][1])

两个匹配的都是love,findall返回的是一个列表,遍历整个内容

                            serch找到一个,就结束
 

 正则表达式实例:

1.使用findall与search从大量文本中匹配感兴趣的内容

先抓大再抓小的原则:也就是一部分匹配的内容在别的地方还有存在,那么先抓取内容的上一层,再在这一层中抓取。

1 import re
2 html = "<ul>12312<a>12312313<a>3123</ul>"
3 text_fied = re.findall("<ul>(.*?)</ul>",html,re.S)[0]
4 the_text = re.findall("<a>(.*?)<a>",text_fied,re.S)
5 print(the_text)

2.使用sub实现换页功能

 1 new_link = re.sub("pageNum=\d+","pageNum=%d"%i,old_url)  

 基本的文本爬虫:

 

 

网页爬虫:

requests库可以获取网页的源代码,再配合正则表达式就可以进行爬虫了

1 import requests
2 html = requests.get(http://tieba.baidu.com/f?kw=python&fr=ala0&tpl=5)
3 print(html.text)

最简单的获取网页源代码
但是有些网页是需要验证才能能够访问,所以,这里还会有一个header也就是假装成浏览器在访问,这样就能够爬虫了               

 

向网页提交数据:

1.Get与Post介绍:get是从服务器上获取数据  Post是想服务器传送数据

                         Get通过构造url中的参数来实现功能   Post将数据放在header提交数据

2.Requests表单提交:核心方法:requests.post

                              核心步骤:构造表单-提交表单-获取返回信息

异步加载:先加载网页的基本信息,后面那个加载好了,再加载那个,提高了网页的加载效率,url是不会改变的,相当于我们平时在饭店吃饭等菜是一个道理!

 

课程爬虫:

 这个在python2.7中用

 1 #_*_coding:utf-8_*_
 2 import requests
 3 import re
 4 
 5 import sys#命令提示符的默认格式为gbk,而网页默认的是utf-8,需要转换
 6 reload(sys)
 7 sys.setdefaultencoding(utf-8)
 8 
 9 class ImoocSpider(object): #创建一个类,含有一个构造方法
10     def __init__(self):
11         print "start spider"
12 
13     def ChangPage(self,url,totalNum):#改变页码,利用sub功能
14         allLink=[]
15         for pageNum in range(1,1+totalNum):
16             allLink.append(re.sub("\d+","%s"%pageNum,url,re.S))
17         return allLink
18 
19     def GetSource(self,link):
20         return  requests.get(link).text
21 
22     def GetEveryClass(self,html):
23         return re.findall(<li id=".*?</li>,html,re.S)
24 
25     def GetInfo(self,eachInfo):
26         info={}
27         info["title"]=re.search(title="(.*?)",eachInfo,re.S).group(1)
28         info["content"] = re.search(<p(.*?)>(.*?)</p>, eachInfo, re.S).group(2)#选择的是第二个匹配的内容
29         timeandlevel=re.findall(<em>(.*?)</em>,eachInfo,re.S)#findall生成的是一个列表,所以下面将两个数据分别存在字典里面
30         info["classtime"] =timeandlevel[0]
31         info["learnlevel"] =timeandlevel[1]
32         return info
33 
34     def saveInfo(self,classInfo): #将爬虫出来的数据写到文件中
35         file=open("info.txt","ab")
36         for each in classInfo:
37             file.write(title: + each[title] + \n)
38             file.write(content:+each[content]+\n)
39             file.write(classtime: + each[classtime] + \n)
40             file.write(learnlevel: + each[learnlevel] + \n)
41             file.write(\n\n)
42 
43         file.close()
44 
45 
46 if __name__ ==__main__:#脚本运行时,程序开始的地方
47     classInfo = []
48     url="http://www.jikexueyuan.com/course/?pageNum=1"
49     spider=ImoocSpider() #实例化这个类
50     allLink=spider.ChangPage(url,20) #调用这个类,并且赋值
51     for link in allLink:
52         print "开始处理链接"+link
53         html=spider.GetSource(link)
54         everyClass=spider.GetEveryClass(html)
55         for each in everyClass:
56             info=spider.GetInfo(each)
57             classInfo.append(info)
58     spider.saveInfo(classInfo)

 

XPath与多线程爬虫:

XPath:是一门语言,可以在XML文档中查找信息,支持HTML,通过元素和属性进行导航

XPath能够非常简便的查找出所需要的内容,就是除去了那些没有用的标签,直接提取内容

 

python并行化介绍:多个线程同事处理任务;

map使用(python的内置函数):一手包办了序列操作,参数传递和结果保存等一系列的操作

from multiprocessing.dummy import Pool

Pool = Pool(4)

result = pool.map(爬取函数,网址列表)

 

正则表达式

原文:http://www.cnblogs.com/DarryRing/p/6395539.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!