1. 安装python开发环境
2. requests库 BeautifulSoup库
3. 具备python一定基础
1. 经过分析可以知道keywork为搜索关键字
2. page参数为筛选商品的页下标,每页30条数据
3. ev参数为筛选商品的价格参数
1. 我们发现商品的数据是访问url直接返回来的 所以我们需要分析下商品所在的标签跟每个商品信息对应的标签
2. 发现所有的商品都放在 ul.class = gl-warp这个标签下,ok我们只需分析处理li 然后遍历ul逐个获取即可
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给过滤了= =!!