更多教程请移步至:洛凉博客
求助请移步至:Python自学技术交流
我感觉自己有个缺点挺不好的。不爱做笔记和总结。
自从工作之后发现不会做总结是多么没有优势。
例如:写个项目总结、工作总结、年中,年终总结。
不百度或者谷歌下发现很难写出点像样的总结报告。
我希望自己能好好改掉这个缺点。以后对自己的所做所学加以记录,方便以后查阅或温习。
昨天一直在看中国大学MOOC大学,北京理工大学,嵩教授主讲的:Python网络爬虫与信息提取。
(这里多说一句【并非打广告】,嵩教授讲的确实不错,思路和代码书写都很谨慎,每次都会强调代码的稳定性,有爬虫意向的朋友可以看看)
昨晚看的主要内容为定向获取某类商品的价格,标题。
看完后自己按照思路敲了一遍。额外多获取了一个商品属性。
这个淘宝搜索后的商品信息好像是以JSON的形式存储在源码里面。
PS:目前为止我好想还没搞明白JSON和AJAX有没有联系。(以后对这方面知识进行补充)
敲完代码运行后好像不成功。
自己找了下原因,我查找的商品类型和嵩教授示例代码里的商品类型不一致。
由于是通过正则进行匹配的数据。(如需获取还需改下正则表达式)
导致数据存储对应的键不一致。下面大家可以看下区别。
书包价格.png
其实如果用嵩教授的商品进行获取,可以获取到更多的商品信息。
例如商品的ID,其实获取到了ID就可以进行商品链接拼接。
这张截图是通过URL链接里的ID在页面源码找的到。
然后可以拼接成:天猫店铺:https://detail.tmall.com/item.htm?id=42252465037,淘宝店铺:https://item.taobao.com/item.htm?id=537105758663的方式进行获取商品链接。
有兴趣的可以尝试下获取更多商品信息。
image.png
好了,其实爬虫需要的是思路,思路清晰,代码就好写了。
我写的可以查找数码这一类商品,例如,某品牌电脑,键盘,鼠标,手机
如果失败大家可以看下源码里面价格和商品名称对应的数据,相应修改后就能正常。
下面直接贴我看完后以老师的思路进行编写的代码。
import requests
import re
def geturl(page,key):
'''获取搜索商品后的页面源码'''
data = {
'q':key,
's':page*44
}
url = 'https://s.taobao.com/search?'
try:
html = requests.get(url,params=data)
html.raise_for_status()
except:
print('-----初始链接获取失败-----')
return html.text
def gethtml(html):
'''匹配源码里需要的数据'''
try:
goods = []
#商品标题,价格,付款人数正则表达式
pat1 = r'\"price\":\"\d{1,5}\"'
pat2 = r'\"title\":\".*?\"'
pat3 = r'\"month_sales\":\"\d{1,9}\"'
prices = re.findall(pat1,html)
titles = re.findall(pat2,html)
sales = re.findall(pat3,html)
for i in range(len(titles)):
#eval去掉字符串两边双引号,以分好切片获取后面要的信息
price = eval(prices[i].split(':')[1])
title = eval(titles[i].split(':')[1])
sale = eval(sales[i].split(':')[1])
#将每个商品的价格,标题,付款人数以表格形式存入到一个空列表
goods.append([title,sale,price])
except:
print('-----信息获取失败-----')
return goods
def printinfo(slist):
'''打印获取到的商品信息'''
#format打印格式
law = '{:^4}\t{:^8}\t{:^8}\t{:^16}'
print(law.format('序号','商品价格','已付款人数','商品名称'))
num = 0 #初始化序号
for x in slist:
num+=1
print(law.format(num,x[2],x[1],x[0]))
def main():
'''程序运行入口'''
pages = int(input('请输入要查询的页数:'))
good_name = input('请输入需要查找的商品类型:')
for page in range(pages):
try:
html = geturl(page,good_name)
slist = gethtml(html)
printinfo(slist)
except:
print('-----程序运行出错-----')
if __name__ == '__main__':
main()
运行后打印效果.png
下面我也把嵩老师代码贴一下,大家不要直接复制运行。会报错。
要试的自己按照代码敲一遍。
import requests
import re
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def parsePage(ilt, html):
try:
plt = re.findall(r'\"view_price\"\:\"[\d\.]*\"',html)
tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])
title = eval(tlt[i].split(':')[1])
ilt.append([price , title])
except: print("")
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():
goods = '书包'
depth = 3
start_url = 'https://s.taobao.com/search?q=' + goods
infoList = []
for i in range(depth):
try:
url = start_url + '&s=' + str(44*i)
html = getHTMLText(url)
parsePage(infoList, html)
except:
continue
printGoodsList(infoList)
main()
网友评论