300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Python爬取京东任意商品数据实战总结

Python爬取京东任意商品数据实战总结

时间:2019-08-16 23:00:06

相关推荐

Python爬取京东任意商品数据实战总结

利用Python爬取京东任意商品数据

今天给大家展示爬取京东商品数据

首先呢还是要分思路的,我分为以下几个步骤:

第一步:得到搜索指定商的url

第二步:获得搜索商品列表信息

第三步:对得到的商品数据进行分析筛选

第四步:保存筛选后的数据

第一步:

进入京东官网后,比如搜索手机,F12打开开发者工具,进行抓包,发现以下是我们所需要的:

也就是

/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8&wq=%E6%89%8B%E6%9C%BA&pvid=4c5cff7150a848e4a75ca16372e953ad

很显然,其中一些参数去掉也无妨,那就测试一下,发现如果是只剩下

/Search?keyword=%E6%89%8B%E6%9C%BA

时,得到的搜索结果并不是手机而是乱码,所以必须吧enc=utf-8给加上,其实这个就是编码格式问题,最终的精简url为

/Search?keyword=%E6%89%8B%E6%9C%BA&enc=utf-8

keyword中就是“手机”这个字符经过utf-8编码后的字符,那么第一步就结束了

第二步:

这一步就是要获取众多商品列表了,通过审查元素即可得到商品列表是在这:

既然知道数据在哪,那么我就用xpath(正则、bs4都可以哟)来进行获取,代码如下:

shangpin_list = res.xpath('//ul[@class="gl-warp clearfix"]/li')

第三步:

既然得到了列表,那么我们就要对数据进行筛选,首先我们先获得商品标题吧,发现其商品标题在下面这个位置(以后有钱了我也要买个T.T):

我们可以用xpath进行筛选出来,代码如下:

name = message.xpath('div[@class="gl-i-wrap"]/div[@class="p-name p-name-type-2"]/a/em/text()')

即可得到本页面所有关于搜索“手机”关键字的商品标题,同样的方法,也可以找到商品价格、店铺名称、链接等,代码如下:

价格:

price = message.xpath('div[@class="gl-i-wrap"]/div[@class="p-price"]/strong/i/text()')

店铺名称:

shopname = message.xpath('div[@class="gl-i-wrap"]/div[@class="p-shop"]/span/a/@title')

注意:在爬取店铺信息时会出现以下情况:

这是爬虫失误了么,其实并不是,仔细对比发现这些值为空的都是京东官方旗舰店的店铺,所以在这里需要自己手动加个判断哟

商品链接:

href = message.xpath('div[@class="gl-i-wrap"]/div[@class="p-name p-name-type-2"]/a/@href')

将这些数据我为了方便就将其存入一个字典,方便存储嘛哈哈,那么第三步就完成了。

第四步:

到了最后的存储环节了是不是贼激动,这里我用with对数据进行存储,代码如下:

def save_message(message_dict):for message in message_dict:with open("D:\英雄时刻\{name}.txt".format(name="京东商品"),"a",encoding="utf-8") as f:f.write("价格:"+message["price"]+" 链接:"+message["href"]+" 店铺名称:"+message["shopname"]+" 商品标题:"+message["name"]+"\n")

那么爬取京东商品数据到这就完毕了,当然,在此基础上还可以用for循环进行指定商品关键字下的多个页面的数据收集,最好带上代理IP哟。

该总结仅用于交流研究使用,请勿用于违法行为哟,不然会被进场叔叔请去喝茶的,哈哈,最后还是老样子,上完整代码:

import requestsfrom lxml import htmlfrom urllib.parse import quote #编码转换函数def change_name(name):#编码转换cname = quote(name,encoding="utf-8")return cname#手机经过utf-8编码为:%E6%89%8B%E6%9C%BAdef get_allmessage(names):#cname = change_name(names)url = "/Search?keyword="+cname+"&enc=utf-8"header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"}response = requests.get(url,headers=header)response.encoding = "utf-8"res = html.fromstring(response.text)shangpin_list = res.xpath('//ul[@class="gl-warp clearfix"]/li')print(len(shangpin_list))get_message(shangpin_list)def get_message(shangpin_list):#数据筛选message_dict = []for message in shangpin_list:name = message.xpath('div[@class="gl-i-wrap"]/div[@class="p-name p-name-type-2"]/a/em/text()')#print(name[0])price = message.xpath('div[@class="gl-i-wrap"]/div[@class="p-price"]/strong/i/text()')if price == []:price = ["预约中"]#print(price[0])shopname = message.xpath('div[@class="gl-i-wrap"]/div[@class="p-shop"]/span/a/@title')#print(shopname[0])href = message.xpath('div[@class="gl-i-wrap"]/div[@class="p-name p-name-type-2"]/a/@href')#print(href[0])if shopname == []:message_dict.append({"name":name[0],"price":price[0],"shopname":'京东官方旗舰店',"href":href[0]})else:message_dict.append({"name": name[0],"price": price[0],"shopname": shopname[0],"href": "https:"+href[0]})save_message(message_dict)def save_message(message_dict):#数据的存储for message in message_dict:with open("D:\英雄时刻\{name}.txt".format(name="京东商品"),"a",encoding="utf-8") as f:f.write("价格:"+message["price"]+" 链接:"+message["href"]+" 店铺名称:"+message["shopname"]+" 商品标题:"+message["name"]+"\n")if __name__ == "__main__":name = input("请输入商品名称:")get_allmessage(name)

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