Python爬⾍(正则表达式)
Python爬⾍(正则表达式)
最近接触爬⾍⽐较多,下⾯我来展⽰⼀个刚爬取的成果,使⽤正则表达式的⽅法,希望对刚开始接触爬⾍的⼩伙伴有所帮助,同时希望⼤佬们给予点评和指导
接下来,步⼊正题,使⽤正则表达式爬取数据是⼀种原始且有效的⽅法,正则表达式的作⽤即字符匹配,匹配出你想得到的数据。
对于正则表达式做⼀下简单整理:
re模块:不同的语⾔均有使⽤正则表达式的⽅法,但各不相同。Python是通过re模块来实现的。
>>>import re
>>> re.search(r'python','java\python\C\C++\php')
<_sre.SRE_Match object; span=(5, 11), match='python'>
search()⽅法⽤于在字符串中搜索正则表达式模式第⼀次出现的位置,这⾥到了,匹配的位置是(5,11)
注意两点:
1、第⼀个参数是正则表达式
2、到后返回范围是以下标0开始的;如果不到,它就返回None.
通配符:*和?就是⼤家熟知的通配符,⽤它表⽰任何字符。正则表达式也有通配符,在这⾥⽤⼀个点号(.)来表⽰,它可以匹配除了换⾏符之外的任意字符:
>>> re.search(r'.','java\python\C\C++\php')
<_sre.SRE_Match object; span=(0, 1), match='j'>
#数量词
#*匹配0次或者⽆限多次
#+匹配1次或者⽆限多次
#?匹配0次或者1次->可以转化成⾮贪婪
import re
a='pytho0python1pythonn2'
r=re.findall('python*',a)
m=re.findall('python+',a)
p=re.findall('python{1,2}?',a)
#贪婪与⾮贪婪
print(r)
print(m)
print(p)
输出结果分别为:
['pytho', 'python', 'pythonn']
['python', 'pythonn']
['python', 'python']
反斜杠:消除特殊字符的特殊功能,即⽤字符的形式显⽰特殊字符。
>>> re.search(r'\.','java\python\C\C++\php.')
<_sre.SRE_Match object; span=(21, 22), match='.'>
特殊符号及⽤法:
——————————————————————————————————————————
下⾯爬取
搜索栏中输⼊python,地址为北京、上海、深圳、⼴州
使⽤正则表达式,输出上的部分信息,如下图:
⼀、要求输出⼯作地点、薪资和发布时间
(1、⼯作地点只输出北京、上海、⼴州、深圳
2、薪资要求最低、最⾼⼯资及万\钱、年\⽉分别输出
)
import re
from urllib import request
#地址
url='search.51job/list/010000%252C020000%252C030200%252C040000,000000,0000,00,9,99,python,2,1.html?lang=c&stype=&postchannel= 0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9&f romType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='
r=request.urlopen(Spider.url)
ad()
htmls=str(htmls,encoding='gbk')
#定位标签div
s=re.findall('<span class="t3">(北京|上海|深圳|⼴州).*</span>\s*<span class="t4">(\d+\.*\d*)-(\d+\.*\d*)(千|万)/(年|⽉)</span>\s*<span class="t5">([\s\S]*?)</s pan>',htmls)
#s=re.findall('<div class="el">([\s\S]*?)</div>',htmls)
#s=re.findall('<span class="t3">(北京|上海|深圳|⼴州).*</span>\s*<span class="t4">(\d+\.*\d*)-(\d+\.*\d*)(千|万)/(年|⽉)</span>',htmls)
for i in range(0,len(s)):
for j in range(0,6):
print(s[i][j],end=' ')
print()
⼆、要求输出⼯作地点、薪资和发布时间(完整输出)
import re
python正则表达式不包含from urllib import request
from urllib import request
#断点调试
class Spider():
url='search.51job/list/010000%252C020000%252C030200%252C040000,000000,0000,00,9,99,python,2,1.html?lang=c&stype=&postchanne l=0000&workyear=99&cotype=99°reefrom=99&jobterm=99&companysize=99&providesalary=99&lonlat=0%2C0&radius=-1&ord_field=0&confirmdate=9 &fromType=&dibiaoid=0&address=&line=&specialarea=00&from=&welfare='
#定位标签div
root_pattern='<div class="el">([\s\S]*?)</div>'
addr_pattern='<span class="t3">([\s\S]*?)</span>'
salary_pattern='<span class="t4">([\s\S]*?)</span>'
date_pattern='<span class="t5">([\s\S]*?)</span>'
'''
root_pattern='<div class="el">([\s\S]*?)</div>'
addr_pattern='<span class="t3">(北京|上海|深圳|⼴州).*</span>'
salary_pattern='<span class="t4">(\d+\.*\d*)-(\d+\.*\d*)(千|万)/(年|⽉)</span>'
date_pattern='<span class="t5">([\s\S]*?)</span>'
'''
def __fetch_content(self):
r=request.urlopen(Spider.url)
ad()
htmls=str(htmls,encoding='gbk')
return htmls
#分析⽂本
def __analysis(self,htmls):
root_html=re._pattern,htmls)
anchors=[]
for html in root_html:
addr=re.findall(Spider.addr_pattern,html)
salary=re.findall(Spider.salary_pattern,html)
'''
for i in range(0,len(salary)):
for j in range(0,4):
w=salary[i][j]
print(w,end=' ')
h=salary[i]
print(h)
print()
#print(salary)
'''
date=re.findall(Spider.date_pattern,html)
anchor={'addr':addr,'salary':salary,'date':date}
anchors.append(anchor)
#print(root_html[0])
#print(len(root_html[0]))
return anchors
#定义字典
def __refine(self,anchors):
l=lambda anchor:{'addr':anchor['addr'][0].strip(),
'salary':anchor['salary'][0],
'date':anchor['date'][0]
}
return map(l,anchors)
#编写排序函数
def __sort(self,anchors):
anchors=sorted(anchors,key=self.__sort_seed)
return anchors
def __sort_seed(self,anchor):
return anchor['addr']
#编写函数,使得得到的字典有序的打印出来
def __show(self,anchors):
for anchor in anchors:
print(anchor['addr']+' '+anchor['salary']+' '+anchor['date'])
'''
for anchor in anchors:
print(anchor['addr']+' '+anchor['date'])
'''
#⼊⼝⽅法
def go(self):
htmls= self.__fetch_content()
anchors=self.__analysis(htmls)
anchors=list(self.__refine(anchors))
anchors=self.__sort(anchors)
#print(anchors)
self.__show(anchors)
spider=Spider()
<()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论