Python爬虫实例:使用requests库和re库爬取某旧书网

背景

在简单学习和了requests库和正则表达式re库后,就尝试使用这两个第三方库完成爬取某旧书网书名价格并输出。于是选择了一个静态网页进行爬取,但是最终输出结果出现了部分乱序,是由于正则表达式遇到网页书名乱码导致的存入形式问题。

算法思路

1.爬取网页数据并解码得到文本
定义get方法爬取静态网页

def getHTML(url):
    try:
        kv={'user-agent':'Mozilla/5.0'}
        r=requests.get(url,headers=kv,timeout=30)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.text
    except:
        return ""

2.按正则表达式查找得到书名和价格并存入列表ilt

def parsePage(ilt, html):
    try:
        plt= re.findall(r'price="(\d.*)"',html)
        tlt= re.findall(r'alt="(.*)(.*)" error="0"',html)
        for i in range(len(plt)):
            ilt.append([plt[i],tlt[i][0]+tlt[i][1]])
    except:
        return ""

3.遍历列表,逐行打印

def printGoodsList(ilt):
    tplt = "{:4}\t{:8}\t{:16}"
    print(tplt.format("序号","价格","商品名称"))
    count = 0
    for g in ilt:
        count = count+1 
        print(tplt.format(count,g[0],g[1]))

4.主函数

def main():
    depth = 3
    start_url= 'http://search.kongfz.com/product_result/? 	key=%E6%B5%8B%E7%BB%98&status=0&_stpmt=eyJzZWFyY2hfdHlwZSI6ImFjdGl2ZSJ9&pagenum='
    infoList=[]
    for i in range(1,depth):
        try:
            url= start_url+str(i)
            html = getHTML(url)
            parsePage(infoList,html)
        except:
            continue
    printGoodsList(infoList)

main()

思考总结

通过这个实例,我发现requests和正则表达式可以获得很多网页上有价值的信息,但是由于正则表达式的复杂性和灵活性,需要完美提取想要的数据是相当不容易的,特别是对于大量的网页信息。于是我开始考虑更好的网页解析方法,进而学习了BeautifulSoup库。
进而在后面的例子中,就可以明显感受到BeautifulSoup库这种解析库和HTML类的标签语言的好用。
以下是本例的源码,感谢阅读。

import requests
import re

#爬取网页数据并解码得到文本
def getHTML(url):
    try:
        kv={'user-agent':'Mozilla/5.0'}
        r=requests.get(url,headers=kv,timeout=30)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.text
    except:
        return ""

#将网页文本按正则表达式查找得到书名和价格并存入列表ilt
def parsePage(ilt, html):
    try:
        plt= re.findall(r'price="(\d.*)"',html)
        tlt= re.findall(r'alt="(.*)(.*)" error="0"',html)
        for i in range(len(plt)):
            ilt.append([plt[i],tlt[i][0]+tlt[i][1]])
    except:
        return ""

#遍历列表,逐行打印
def printGoodsList(ilt):
    tplt = "{:4}\t{:8}\t{:16}"
    print(tplt.format("序号","价格","商品名称"))
    count = 0
    for g in ilt:
        count = count+1 
        print(tplt.format(count,g[0],g[1]))
        
def main():
    depth = 3
    start_url= 'http://search.kongfz.com/product_result/?key=%E6%B5%8B%E7%BB%98&status=0&_stpmt=eyJzZWFyY2hfdHlwZSI6ImFjdGl2ZSJ9&pagenum='
    infoList=[]
    for i in range(1,depth):
        try:
            url= start_url+str(i)
            html = getHTML(url)
            parsePage(infoList,html)
        except:
            continue
    printGoodsList(infoList)

main()

你可能感兴趣的:(Python爬虫)