python的爬虫技术中的正则表达式部分,主要涉及到re库的使用。
Python re库
python的re库,其中涉及到几个重要的函数:
- re.match函数:re.match 尝试从字符串串的起始位置匹配⼀个模式,如果不是起始位置匹配成功的话,match()就返回none。
- re.search函数:re.search 扫描整个字符串串并返回第一个成功的匹配。
- re.sub⽤用于替换字符串中的匹配项
- re.compile函数:compile函数用于编译正则表达式,生成一个正则表达式对象(pattern),供search和match函数使用。
- findall函数:在字符串中找到正则表达式所匹配的所有子串,如果没有找到匹配的,则返回空列表。
- re.finditer:和findall类似,不过返回结果是一个迭代器。
一些有用的正则表达式
email地址(只允许英文字母、数字、下划线、英文句号以及中划线):
^[\w_-]+@[\w_-]+(\.[\w_-]+)+$
IPV4地址(IP地址分为4段,每段0-255):
^(0|[1-9]\d?|1\d\d|2[0-4]\d|25[0-5])(\.(0|[1-9]\d?|1\d\d|2[0-4]\d|25[0-5])){3}$
后续积累的写在这里…
爬取淘宝的某商品页面(此处选取商品为“书包”)
通过对搜索页面的URL的观察,容易发现,其URL遵循一定的规律,如下:
其搜索页面基本URL格式如下:
https://s.taobao.com/search?q=' + goods'&s=' + str(44 * i)
其中goods表示商品名称,此处是“书包”,i表示页数
代码结构如下:
#利用requests库获取HTML文本:
def getHTML(url):
try:
r=requests.get(url)
r.encoding=r.apparent_encoding
return r.text
except:
return ""
#getInfo函数,爬取界面的信息:
def getInfo(ilt,n,raw_url):
goods='书包'
for i in range(n):
url=raw_url+goods+'&s='+str(44*i)
html=getHTML(url)
plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"', html)
tlt = re.findall(r'\"raw_title\"\:\".*?\"', html)
for t in range(len(plt)):
price = eval(plt[t].split(':')[1])
title = eval(tlt[t].split(':')[1])
ilt.append([price, title])
#其中ilt是最后存放信息的列表,raw_url为基本的地址 'https://s.taobao.com/search?q=',后面通过商品名称和页数进行补足;函数遍历每个页将需要的信息找出来,以列表形式添加到列表中作为元素。
查看网页源代码:
可以发现 view_price表示的是价格, raw_title对应的是标题,故用正则表达式找出对应的内容填入。
#格式化打印函数
def printList(ulist, num):
tplt = "{0:^4}\t{1:{3}^8}\t{2:^12}"
print(tplt.format("序号", "价格", "商品名称", chr(12288)))
tpp = "{0:^4}\t{1:^12}\t{2:^16}"
for i in range(num):
u = ulist[i]
print(tpp.format(i+1, u[0], u[1]))
#main函数,主要进行变量的初始化和函数调用
#此处n值决定了后面爬取的页数,n取2表示后面将爬取两页的数据
def main():
ilt=[]
n=2
raw_url='https://s.taobao.com/search?q='
getInfo(ilt,n,raw_url)
printList(ilt,len(ilt))