#!/usr/bin/python3

# -*- coding: UTF-8 -*-

import urllib.request

import urllib.error

import re

import csv

import time

global_row = 0

'''

需求:

爬取京东商品数据,以‘java’关键字为例。要求使用最基础的urllib和re库。

需要保存书名,价格,评论数,出版社等信息。

实现:

找出页面规律如下

一、每页显示60个商品,但分为两部分。

1. 每页前30个商品,通过search.jd.com/Search?keyword=java接口获取

每页后30个商品,通过search.jd.com/s_new.php?keyword=java接口获取,这个接口是个XHR请求,通过Chrome的开发者选项可以看出。模拟人向下滚动页面

2. 每个接口有两个关键的参数'page'和's'

参数'page'好理解,就是页面数。对第一个接口变化规律为1,3,5...,对第二个接口变化规律为2,4,6...;

参数's'我猜应该是start,也就是起始商品的索引。实际测试时,这个参数变化不是很规律,这里强制设置每页30个,

这样对第一个接口变化规律1,61,121...,对第二个接口变化规律为31,91,151...

3. 对于获取不到商店名称的情况,再构造chat1.jd.com/api/checkChat请求,获取商店名称。(但还是存在获取不到的情况,页面也不能显示)

'''

def crawl_page(n, csv_writer):

#上半部分网页

top_url = 'http://search.jd.com/Search?keyword=java&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&page=%d&s=%d&click=0' % (2*n- 1, 1 + 60*(n - 1))

content = get_page_content(top_url, True)

parse_content(content, n, csv_writer)

#下半部分网页(需要发送XHR请求的)

current_time = '%.5f' % time.time()

url = 'http://search.jd.com/s_new.php?keyword=java&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&page=%d&s=%d&scrolling=y&log_id=%s' %(2*n, 31 + 60*(n - 1), current_time)

content = get_page_content(url, False)

parse_content(content, n, csv_writer)

def get_page_content(url, is_top):

req = urllib.request.Request(url)

req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3192.0 Safari/537.36')

if not is_top:

req.add_header('Referer', 'http://search.jd.com/Search?keyword=java&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&click=0')

req.add_header('X-Requested-With', 'XMLHttpRequest')

response = urllib.request.urlopen(req)

return response.read().decode('utf8')

def get_seller(shop_url):

req = urllib.request.Request(shop_url)

req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3192.0 Safari/537.36')

req.add_header('Referer', 'http://search.jd.com/Search?keyword=java&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&click=0')

response = urllib.request.urlopen(req)

content = response.read().decode('utf8')

print('content', content)

seller = re.search(r'"seller":"(.*?)"', content)

if seller:

#获得的值为类似于"\u58a8\u9a6c\u56fe\u4e66\u65d7\u8230\u5e97",需要转码

return seller.group(1).encode('latin-1').decode('unicode_escape')

return ''

def parse_content(content, n, csv_writer):

li_list = re.findall(r'

.*?', content, re.DOTALL)

for li in li_list:

#书名

name_match = re.search(r'

.*?(.*?).*?

', li, re.DOTALL)

name = ''

if name_match:

name = re.sub(r'<.>', '', name_match.group(1))

else:

print('page %d, name is empty' % n)

#价格

price_match = re.search(r'

.*?(.*?).*?

', li, re.DOTALL)

price = ''

if price_match:

price = price_match.group(1)

else:

print('page %d, price is empty' % n)

#评论数

commit_match = re.search(r'

.*?(.*?).*?

', li, re.DOTALL)

commit = ''

if commit_match:

commit = commit_match.group(1)

else:

print('page %d, price is empty' % n)

#出版社(商店)

shop_match = re.search(r'

]*>\s*]*>]*>(.*?).*?

', li, re.DOTALL)

shop = ''

if shop_match:

shop = shop_match.group(1)

else:

uid = re.match(r'

.*?', li, re.DOTALL).group(1)

seller_url = 'https://chat1.jd.com/api/checkChat?pid=' + uid + '&returnCharset=utf-8'

shop = get_seller(seller_url)

if not shop:

print('page %d, shop is empty' % n)

global global_row

global_row = global_row + 1

csv_writer.writerow([str(global_row), name, price, commit, shop])

def main():

with open('output.csv', 'w', encoding='gbk') as f:

csv_writer = csv.writer(f)

csv_writer.writerow(['序号', '书名', '价格', '评论数', '出版社'])

for i in range(1, 6):

crawl_page(i, csv_writer)

if __name__ == '__main__':

main()

python爬取京东商品代码_Python简单爬取京东商品列表相关推荐

  1. python爬取豆瓣电影信息_Python|简单爬取豆瓣网电影信息

    前言: 在掌握一些基础的爬虫知识后,就可以尝试做一些简单的爬虫来练一练手.今天要做的是利用xpath库来进行简单的数据的爬取.我们爬取的目标是电影的名字.导演和演员的信息.评分和url地址. 准备环境 ...

  2. python 爬取网页 通知消息_python简单爬取页面信息及实现打开、关闭浏览器

    声明:本文仅是为了学习而举例说明python的强大,禁止用于不良目的! 1.python可以打开浏览器并浏览网页,并且保存网页内容到本地硬盘 实现代码如下: import urllib import ...

  3. python爬去百度百科词条_python简单爬虫爬取百度百科python词条网页

    目标分析: 目标:百度百科python词条相关词条网页 - 标题和简介 入口页:https://baike.baidu.com/item/Python/407313 URL格式: - 词条页面URL: ...

  4. python爬取有道翻译的代码_python实现爬取有道翻译

    声明: 1.图文思路来源于本站UP:轻松学Python.视频跳转链接. 2.爬取时应当robots协议.自觉维护网站权益 3.本代码仅限学习交流使用 4.转载附初始创作者信息 >>> ...

  5. python爬取知乎live_Python爬虫 - 简单抓取百度指数

    前言有点忙,没空写东西,这是之前写的,加了些配图而已 这次要爬的网站是百度指数 正文 一.分析 打开网站(百度指数),呈现出来是这样的 如果搜索的话就需要登陆了,如果没有什么特别频繁的请求的话,直接登 ...

  6. python跑一亿次循环_python爬虫爬取微博评论

    原标题:python爬虫爬取微博评论 python爬虫是程序员们一定会掌握的知识,练习python爬虫时,很多人会选择爬取微博练手.python爬虫微博根据微博存在于不同媒介上,所爬取的难度有差异,无 ...

  7. python爬取知乎标题_python爬虫 爬取知乎文章标题及评论

    目的:学习笔记 2.首先我们试着爬取下来一篇文章的评论,通过搜索发现在 response里面我们并没有匹配到评论,说明评论是动态加载的. 3.此时我们清空请求,收起评论,再次打开评论 4.完成上面操作 ...

  8. python同时注释多行代码_python怎么同时对多行代码进行注释

    学会向程序中添加必要的注释,也是很重要的.注释不仅可以用来解释程序某些部分的作用和功能(用自然语言描述代码的功能),在必要时,还可以将代码临时移除,是调试程序的好帮手. 当然,添加注释的最大作用还是提 ...

  9. python中怎么取整数案例题_python中如何取整数

    首先,不得不提醒大家一个容易被忽视或者搞混的问题--一般的,0.5这种末尾是5的小数,四舍五入取整应进位.这个进位的意思是:-0.5 → -1:0.5 → 1.即正负情况不同,都向着远离0,使得绝对值 ...

最新文章

  1. 山东大学教授建议:让博士生先回学校
  2. 算法结构2.希尔排序
  3. apache httpclient 工具类_Java教程分享使用HttpClient抓取页面内容
  4. HOG:从理论到OpenCV实践
  5. SQL Server 2017 AlwaysOn AG 自动初始化(十五)
  6. 每天学一点flash(16) as3.0 与asp通信(3) 错误探究
  7. 判断2个list中是否有相同的数据(相交)Collections.disjoint
  8. Linux内核品读 /基础组件/ 模块机制快速入门
  9. BAJT 中高级 Java 面试题答案
  10. vue 绑定背景图片、图片
  11. 全网首发:麒麟平台更新时提示错误:无法解析域名“archive.kylinos.cn”
  12. 才子进销存软件各版本说明
  13. 拉普拉斯平滑处理介绍
  14. 运维工程师可能遇到的面试题
  15. 奥维查看行政边界_全国乡镇行政区划数据乡镇边界数据查询获取方式
  16. Linux:进程间通信(创建匿名管道,父子进程间通信,兄弟进程间通信)
  17. 阿里云HaaS100物联网开发板学习笔记(三)轻应用初步--用js让小灯闪烁起来
  18. win10专业版没有触摸板选项_Windows10触控板的正确使用方法
  19. STM32F10x_模拟I2C读写EEPROM(2)(切换SDA方向 + 读ACK位 + 完整代码)
  20. Caesar Cipher(线段树维护哈希)

热门文章

  1. LCAC第十六次会议重要内容摘取 与 LCAC003号提案公示
  2. Cisco与H3C交换机互联的小风波
  3. 计算机里硬盘图标,两妙方轻松更改电脑硬盘盘符的图标
  4. 2019年前端road map
  5. 欧朋Opera 浏览器(打不开百度)提示“您的连接不是私密连接”,解决办法
  6. 逻辑测试插座市场深度研究分析报告
  7. Java8-19新特性一览 ,认识全新的前沿技术
  8. Hadoop服务器集群崩溃的解决方案
  9. 刷题-洛谷-P1179 数字统计
  10. PyQt开发实战: 利用QToolBox开发的桌面工具箱