python抓取京东的商品信息

一、需要具备的技能以及开发环境:

1. 安装python开发环境

2. requests库  BeautifulSoup库

3. 具备python一定基础

二、分析JD搜索商品的URL参数

1. 经过分析可以知道keywork为搜索关键字

2. page参数为筛选商品的页下标,每页30条数据

3. ev参数为筛选商品的价格参数

三、接着 我们分析一下 URL返回来的数据 定位到我们需要的数据

1. 我们发现商品的数据是访问url直接返回来的 所以我们需要分析下商品所在的标签跟每个商品信息对应的标签

python抓取京东的商品信息_第1张图片

2. 发现所有的商品都放在 ul.class = gl-warp这个标签下,ok我们只需分析处理li 然后遍历ul逐个获取即可

四、那么开始coding

1.首先封装一个商品类 


class jd_product:
	def __init__(self):
		#self.img_path = None #商品图片本地路径
		self.img_url = None #商品图片url
		self.price = None #商品价格
		self.keyword = [] #商品关键字
		self.num_of_comment = None #商品评论数
		self.seller_name = None #卖家名称
		self.seller_url = None #卖家店铺URL
		self.tags = [] #商品标签

	def __repr__(self):
		return self.__str__()

	def __str__(self):
		return '''
		价格:{}
		关键字:{}
		商品标签:{}
		卖家:{}
		评论数:{}

		'''.format(self.price, self.keyword, self.tags, self.seller_name, self.num_of_comment)

2. 开始用request获取到页面数据,重要一点User-Agent这些关键的参数还是要填充一下,以防被封IP(之前抓58工作岗位的时候没在意这些细节就被封了 = =)

from bs4 import BeautifulSoup
import urllib
keyword = '男衣服' #你可以使用 input输入关键字
url = 'https://search.jd.com/Search?keyword=%s&page=1' % (urllib.quote(keyword))
host = 'search.jd.com'
headers = {
	"Host": 'search.jd.com',
	"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0",
	"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
	"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
	"Accept-Encoding": "gzip, deflate",
	"Connection": "keep-alive",
	"Referer": url,
	"Upgrade-Insecure-Requests": "1"
}
response = requests.get(url, headers=headers)
bs=BeautifulSoup(response.content)
ul = find(bs, 'ul', {'class':'gl-warp'})

jdps = []
for i in ul.children:
	if not isinstance(i, element.Tag):
		continue #过滤掉 换行\n

	jdp = jd_product()

	dimg = find(i, 'div', {'class':'p-img'})
	if dimg:
		jdp.img_url = find(dimg, 'img')['src']

	dprice = find(i, 'div', {'class':'p-price'})
	if dprice:
		jdp.price = find(dprice, 'i').string

	pname = find(i, 'div', {'class':'p-name'})
	if pname:
		for j in find(pname, 'em').stripped_strings:
			jdp.keyword.append(j)

	pshop = find(i, 'div', {'class':'p-shop'})
	if pshop:
		shop = find(pshop, 'a', {})
		if shop:
			jdp.seller_name = shop.string 
			jdp.seller_url = host + shop['href']

	pcommit = find(i, 'div', {'class':'p-commit'})
	if pcommit:
		for j in pcommit.stripped_strings:
			jdp.num_of_comment += j

	picons = find(i, 'div', {'class':'p-icons'})
	if picons:
		for j in picons.stripped_strings:
			jdp.tags.append(j)

	jdps.append(jdp)

print(jdps)

结果看图:

评论数 跟 运费险标签是动态加上去  就不去分析了

ps:  同样的代码在本地运行可以抓到数据  在我的阿里云环境上跑 竟然返回跳转登录界面

用curl验证一下:

猜想是不是JD粗暴的把阿里云服务器的IP给过滤了= =!!

 

你可能感兴趣的:(python)