1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Python网络爬虫获取淘宝商品价格

Python网络爬虫获取淘宝商品价格

时间:2019-08-08 11:51:31

相关推荐

Python网络爬虫获取淘宝商品价格

1、Python网络爬虫获取淘宝商品价格代码:

#-*-coding:utf-8-*-'''Created on 3月17日@author: lavi'''import requestsfrom bs4 import BeautifulSoupimport bs4import redef getHTMLText(url):try:r = requests.get(url,timeout=30)r.raise_for_statusr.encoding = r.apparent_encodingreturn r.textexcept:return ""def parserPage(goodsList,html):tlt = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html)plt = re.findall(r'\"raw_title\"\:\".*?\"',html) #添加问号使用最小匹配的for i in range(len(tlt)):title = eval(tlt[i].split(':')[1]) #eval()函数十分强大,可以将将字符串str当成有效的表达式来求值并返回计算结果price = eval(plt[i].split(':')[1])goodsList.append([title,price])def printPage(goodsList):tplt="{:6}\t{:8}\t{:16}"print(tplt.format("序号","价格","商品名称"))for i in range(len(goodsList)):goods = goodsList[i]print(tplt.format(i+1,goods[0],goods[1]))def main():goods = "书包"depth = 2;url = "/search?q="goodsList = []for i in range(depth):html = getHTMLText(url+goods+"&s="+str(i*44))parserPage(goodsList, html)printPage(goodsList)main()

2、eval()函数使用扩展

eval()函数十分强大,官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果。so,结合math当成一个计算器很好用。另外可以把list,tuple,dict和string相互转化。

a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"b = eval(a)bOut[3]: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]type(b)Out[4]: lista = "{1: 'a', 2: 'b'}"b = eval(a)bOut[7]: {1: 'a', 2: 'b'}type(b)Out[8]: dicta = "([1,2], [3,4], [5,6], [7,8], (9,0))"b = eval(a)bOut[11]: ([1, 2], [3, 4], [5, 6], [7, 8], (9, 0))

可于看到eval()函数的功能十分强大,但是安全性也是其致命的缺点。想一想这种使用环境:需要用户输入一个表达式,并求值。如果用户恶意输入:

__import__('os').system('dir')

那么eval()之后,你会发现,当前目录文件都会展现在用户前面。那么继续输入:

open('文件名').read()

代码都给人看了。获取完毕,一条删除命令,文件消失。

3、Python正则表达式的最小匹配

Python中正则表达式re模块默认使用贪婪匹配,即最大匹配。但我们也有需要使用最小匹配的时候,下面就来看看什么是最下匹配,以及如何实现最小匹配:

最短匹配应用于:假如有一段文本,你只想匹配最短的可能,而不是最长。

例子

比如有一段html片段,'\this is first label\\the second label\',如何匹配出每个a标签中的内容,下面来看下最短与最长的区别。

代码

import re>>> str = '<a>this is first label</a><a>the second label</a>'>>> print re.findall(r'<a>(.*?)</a>', str) # 最短匹配['this is first label', 'the second label']>>> print re.findall(r'<a>(.*)</a>', str)['this is first label</a><a>the second label']

解释

例子中,模式r'(.*?)'的意图是匹配被和包含的文本,但是正则表达式中*操作符是贪婪的,因此匹配操作会查找出最长的可能。

但是在*操作符后面加上?操作符,这样使得匹配变成非贪婪模式,从而得到最短匹配。

参考资料:

1、中国大学MOOCPython网络爬虫与信息提取课程

2、/articles/BBVnQbq

3、/jhao/p/5989241.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。