0%

PythonDataAnalysis_2--使用re库进行数据操作

  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遵循一定的规律,如下:

taobao_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=',后面通过商品名称和页数进行补足;函数遍历每个页将需要的信息找出来,以列表形式添加到列表中作为元素。

查看网页源代码:

taobao_source

可以发现 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))