爬取京东商品信息
2017-02-06 本文已影响129人
_weber_
功能
从京东商城的商品列表页面解析出商品详情页链接,进而解析出商品名称,编号,店铺,品类等信息
代码片段及说明
- 模块导入
使用requests和Beautifulsoup进行网页解析
time模块来限制爬取频率,以免被封
import requests
from bs4 import BeautifulSoup
import time
- 函数get_detail_urls()
以商品列表页地址为输入参数,解析出商品详情页的地址,保存在列表中并返回
def get_detail_urls(list_url):
"""从商品列表页list_url解析出商品详情页detail_urls"""
time.sleep(2)
res = requests.get(list_url)
soup = BeautifulSoup(res.text, 'lxml')
data = soup.select('div.jDesc > a')
detail_urls = []
for detail_url in data:
detail_urls.append(detail_url.get('href'))
return detail_urls
- 函数get_detail()
以详情页地址为输入参数,获取商品名称,编号,店铺和分类信息,保存在字典中并返回
def get_detail(detail_url):
"""从商品详情页获取商品名称,编号,店铺和分类信息"""
time.sleep(2)
res = requests.get(detail_url)
soup = BeautifulSoup(res.text, 'lxml')
sku_name = soup.select('div.p-parameter > ul > li:nth-of-type(1)')[0].get_text().split(':')[-1]
sku_num = soup.select('div.p-parameter > ul > li:nth-of-type(2)')[0].get_text().split(':')[-1]
shop = soup.select('div.p-parameter > ul > li:nth-of-type(3)')[0].get_text().split(':')[-1]
cate_tmp = soup.select('div.p-parameter > ul > li:nth-of-type(5)')
if cate_tmp != []:
cate = cate_tmp[0].get_text().split(':')[-1]
else: cate = cate_tmp
data = {
'sku_name':sku_name,
'sku_num':sku_num,
'shop':shop,
'cate':cate,
}
return data
- 运行
因为京东有反爬措施,不能直接使用地址栏中的地址,通过分析js文件找到如下list_urls的真实地址,改变pageNo值即可顺序爬取全部页面。
这里我爬取的是服务产品页面的信息,其他产品可能略有差异,请参考使用。
if __name__ == '__main__':
list_urls = ['https://module-jshop.jd.com/module/getModuleHtml.html?appId=496014&orderBy=3&pageNo={}' \
'&direction=1&categoryId=0&pageSize=24&pagePrototypeId=8&pageInstanceId=27448388&moduleInstanceId=27448395' \
'&prototypeId=68&templateId=401682&layoutInstanceId=27448395&origin=0&shopId=162403&venderId=167694'.format(str(i)) for i in range(1, 100)]
detail_urls = []
for list_url in list_urls:
detail_urls.extend(get_detail_urls(list_url))
for detail_url in detail_urls:
data = get_detail('https:' + detail_url)
data['detail_url'] = 'https:' + detail_url
print(data)