今天要写的是之前写过的一个程序,然后把它整理下,巩固下知识点,并对之前的代码进行一些改进。
今天要爬取的是淘宝里的关于手机的报价的信息,并按照自己想要价格来筛选。
要是有什么问题希望大佬能指出我的错误。
先列出代码中要用到的URL:
淘宝搜索手机的url:https://s.taobao.com/search?q=手机&s=0
代码用到的是requests - re
第一步:
先分析这个url,”?“后面的都是它的关键字,requests中get函数的关键字的参数是params,post函数的关键字参数是data,
关键字用字典的形式传进去,这样我们就可以自己改关键字去搜索别的东西或者是搜索别的页面,我对手机比较感兴趣所以
就爬取了关于手机的页面。😁
第二步:
直接先给出源代码,然后细节再慢慢的说。
# encoding:utf8 import requests import re def printGoodsList(list): list = sorted(list,key=lambda x: x[1],reverse=True) m = '{:16}\t{:8}' print(m.format("商品名称", "商品价格")) for i in list: print(m.format(i[0],i[1])) def main(): phone = [] data={ 'q':'手机', 's':0 } url = 'https://s.taobao.com/search' for i in range(0,48*10,48): data['s'] = i try: r = requests.get(url,params=data) r.encoding=r.apparent_encoding html = r.text reg = r'"title":"(.*?)".*?"price":"(.*?)"' phonelist = re.findall(reg, html) except: print("失败") for a in phonelist: if(int(a[1])>4000): phone.append((a[0],int(a[1]))) printGoodsList(phone) main()
从main函数里看:
先定义一个phone的列表存储关于手机的信息。
然后定义一个data的字典,里面是url关键字的信息。
用一个for循环爬取多页的信息。
for循环里:
r = requests.get(url,params=data) r.encoding=r.apparent_encoding html = r.text
这些是获取页面信息。
reg = r'"title":"(.*?)".*?"price":"(.*?)"' phonelist = re.findall(reg, html)
用最简单的正则表达式 .*? 提取出我们想要的手机的名字跟手机的价格(正则表达式还没有深入去学习🙄),有小伙伴想
获取其他的信息也可以自己去试试匹配你想要提取的信息,然后把提取出来的信息存放到phonelist里。获取网页信息当中要用
try except,捕捉出现的异常。
for a in phonelist: if(int(a[1])>4000): phone.append((a[0],int(a[1])))
再用一个for循环把提取到的信息添加在phone列表里(以元组的形式存放进去,因为方便之后的排序),当然你也可以再筛选其中的信息,
我就是筛选了价格高于四千的手机,看下土豪用的都是些什么手机🤣。
然后调用printGoodsList函数,接下来我们说说这个函数:
def printGoodsList(list): list = sorted(list,key=lambda x: x[1],reverse=True) m = '{:16}\t{:8}' print(m.format("商品名称", "商品价格")) for i in list: print(m.format(i[0],i[1]))
函数里的一个行用到的是sorted函数,这个函数有几个参数,第一个是可迭代的对象,第二个是具有两个参数的比较的函数,第三个是进行
比较的元素,只有一个参数,最后一个参数是排序规则,默认值是False,从小到大的排序。
我用到的是lambda这个匿名函数,然后把排序后的信息赋值给list
后面就是输出我们排好序的信息。
总结:
写这个代码的时候给我最大的困难就是排序,我之前是把提取出来的信息以列表的信息存放在phone列表中,后来发现这样无法根据其中的一个元素
来排序,后面百度发现元组可以这样,所以我后来改用了元组。如果有大佬知道什么其他的排序的方法希望大佬们可以指点指点热爱学习的小菜鸟。