1、本博文中代码是转载内容,原文章地址如下:
https://segmentfault.com/a/1190000014688216
2、原作者讲解的很详细,我只是在原文代码的基础上稍作修改,添加了一些注释及无关紧要的代码
3、本篇博文涉及知识点如下:
①通过对比页面构造爬取网址
②获取日期及当前时间
③获取网页json内容
④通过观察json内容找到哪些关键点是要提取的信息,注意各个字典的嵌套
#python3.6
import re
import requests
from datetime import date
import json
import time
def sousuo(keyword,date_,select_type,pages):
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit'
'/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36'}
item_ids = [];titles = [];prices = [];locations = [];sales_count = [];user_ids = [];store_names = []
for i in range(int(pages)):
page = str(44 * i)
#构造网址
url = 'https://s.taobao.com/search?q={}&imgfile=&js=1' \
'&stats_click=search_radio_all%3A1&initiative_id={}&ie=utf8{}&s={}'\
.format(keyword,date_,selection[select_type],pages)
r = requests.get(url, headers=headers)
#所有的商品信息都在p_page_config的字典内
data = re.search(r'g_page_config = (.+);',r.text)
#载入json中的内容
data = json.loads(data.group(1), encoding='utf-8')
#层层剥离,每个商品的信息都在一个字典里,所有商品的字典组成一个auctions列表,
# mods、itemlist、data、auctions 这几个字典是嵌套关系
for auction in data['mods']['itemlist']['data']['auctions']:
#以下语句是把一个商品的特定信息加到指定的列表里,结合上面的for循环,可把所有商品的信息都加到指定的列表中
item_ids.append(auction['nid']) #nid是商品的编号
titles.append(auction['raw_title']) #raw_title是商品的名字
prices.append(auction['view_price']) #view_price是商品价格
locations.append(auction['item_loc']) #item_loc是卖家地址
sales_count.append(auction['view_sales']) #view_sales是商品销售量
user_ids.append(auction['user_id']) #user_id是卖家的id
store_names.append(auction['nick']) #nick是卖家商店的店名
# 为便于观察进度,添加了print
print('已完成%d页' % (i+1))
# 隔一段时间访问一次,以免出现"远程主机强迫关闭了一个现有的连接 10054"
# 设置5秒的时候还是会出现连接失败的情况,设置10秒基本不会出现连接失败的情况,但是时间有点长,本次仅做测试学习用,更好的方法以后再改进
time.sleep(10)
#显示每个商品信息是否齐全
print(len(item_ids),len(titles),len(prices),len(locations),len(sales_count),len(user_ids),len(store_names))
print(item_ids)
print(titles)
print(prices)
print(locations)
print(sales_count)
print(user_ids)
print(store_names)
return len(item_ids)
#设置用那种方式进行商品排序,default是综合排序,sale-desc是按销售量排序
selection = { '0':'&sort=default','1':'&sort=sale-desc'}
date_ = str(date.today()).replace('-','')
keyword = input('输入商品名:')
pages = input('爬多少页:')
select_type = input('输入0按默认排序,输入1按销量排序:')
#为便于测试,添加了如下语句
if not keyword:
keyword = '电脑'
if not select_type:
select_type = '0'
if not pages:
pages = '1'
#time.time()获取当前的时间戳,便于显示爬取耗费的时间
current_time = time.time()
item_count = sousuo(keyword, date_, select_type, pages)
#用当前的时间点减去爬取之前记录的时间点就是爬取网站耗去的时间
cost_time = int(time.time().__float__() - current_time.__float__())
print('\n\n抓取%s页,共%d个商品,用时%ds' % (pages,item_count,cost_time))