京东商城有很多商品信息可供爬取,这次主要爬取全部手机综合排序的第一页
一、相关爬取页面分析
页面地址:
https://list.jd.com/list.html?cat=9987,653,655
对应源码:
其中价格、评论数需要动态获取
先来看价格信息,访问的URL格式为
https://p.3.cn/prices/mgets?skuIds=J_(data-sku)
括号里的data-sku为商品id,打开url返回
再看评论信息,访问的URL格式为
https://club.jd.com/comment/productCommentSummaries.action?referenceIds=(data-sku)
括号里的data-sku为商品id,打开url返回
二、python3代码说明
爬取思路:
1、 爬取该网页的源代码(前述分析,函数模块getHTMLText(url))
def getHTMLText(url):
try:
user_agent =
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
#模拟浏览器登陆
headers = {
'User-Agent': user_agent}
r = requests.get(url, headers = headers)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return
''
2、用 Beautiful Soup提取所需内容
3、 根据网页源代码对所取内容进行精准修改以获取所需内容
def get_info(url):
html = getHTMLText(url)
#创建 beautifulsoup 对象
soup = BeautifulSoup(html,
'lxml')
items = soup.select(
'li.gl-item')
results = []
for item
in items:
item_url =
'http:' + item.find(
'div', class_=
'p-name').find(
'a')[
'href']
name = (item.find(
'div', class_=
'p-name').find(
'em').string).strip()
data_sku = item.find(
'div', class_=
'p-focus').find(
'a')[
'data-sku']
price_url =
'https://p.3.cn/prices/mgets?skuIds=J_' + str(data_sku)
price = requests.get(price_url).json()[
0][
'p']
commit_url =
'https://club.jd.com/comment/productCommentSummaries.action?referenceIds=' + str(data_sku)
comments = requests.get(commit_url).json()[
'CommentsCount'][
0][
'CommentCountStr']
shop_name = item.find(
'div', class_=
'p-shop')[
'data-shop_name']
results.append([name, item_url, data_sku, price, comments, shop_name])
return results
4、把内容写入到文件
def save_to_csv(results):
path =
'E:/京东商品信息爬取/'
if
not os.path.exists(path):
os.mkdir(path)
with open(path + datetime.now().strftime(
'%Y-%m-%d %H-%M-%S') +
'京东手机信息.csv',
'w')
as f:
writer = csv.writer(f, lineterminator=
'\n')
writer.writerow([
'商品',
'链接',
'ID',
'价格',
'评论数',
'店铺'])
writer.writerows(results)
主要代码(jdspider.py)
https://github.com/zhhaoqin/jdspider三、结果
四、小结
实现了一个爬虫的基本功能,后续可根据需要在此基础上进行扩充完善,例如多线程的并发爬取,验证码交互等。