在简单学习和了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()