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:是一门语言,可以在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