正则表达式

本文详细介绍正则表达式的使用技巧,包括贪心与非贪心匹配、findall与search的区别,以及如何结合requests库进行网页爬虫。通过具体案例展示了正则表达式的强大功能。

正则表达式符号与方法:

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(爬取函数,网址列表)

 

转载于:https://www.cnblogs.com/DarryRing/p/6395539.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值