scrapy+splash 爬取京东动态商品
作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/3159
splash是容器安装的,从docker官网上下载windows下的docker进行安装。
下载完成之后直接点击安装,安装成功后,桌边会出现三个图标:
点击 Docker QuickStart 图标来启动 Docker Toolbox 终端。
使用docker启动服务命令启动Splash服务
docker run -p 8050:8050 scrapinghub/splash
这里我已经开启服务了
打开cmd,在当前目录下开始scrapy爬虫:
scrapy startproject scrapy_examples
在spider文件夹中新建python文件jd_book.py用于编写爬虫
在项目下新建pybook.py用于对数据文件csv处理
京东上的商品是动态加载的,爬取python书籍的前20页,获取每个商品的评论数、书名、简介。
SplashRequest(url,endpoint='execute',args={'lua_source':lua_script},cache_args=['lua_source'])请求页面并执行JS函数渲染页面
endpoint='execute':在页面中执行一些用户自定义的JavaScript代码
args={'lua_source':lua_script}:用户自定义的lua脚本
cache_args=['lua_source']:让Splash服务器缓存该函数
用户自定义的lua脚本中必须包含一个main函数作为程序入口,main函数被调用时会传入一个splash对象(lua中的对象),用户可以调用该对象上的方法操纵Splash。
splash.args属性:用户传入参数的表,通过该属性可以访问用户传入的参数
splash:go方法:类似于在浏览器中打开某url地址的页面,页面所需资源会被加载,并进行JavaScript渲染
splash:wait方法:等待页面渲染,time参数为等待的秒数
splash:runjs方法:在当前页面下,执行一段JavaScript代码
splash:html方法:splash:html()获取当前页面的HTML文本。
middlewares.py随机产生User-Agent添加到每个请求头中
pipelines.py处理爬取的数据并存入数据库
settings.py配置splash服务信息、设置请求延迟反爬虫、添加数据库信息
# -*- coding:utf-8 -*-
import scrapy
from scrapy import Request
from scrapy_splash import SplashRequest
from splash_examples.items import PyBooksItem lua_script ='''
function main(splash)
splash:go(splash.args.url)
splash:wait(2)
splash:runjs("document.getElementsByClassName('pn-next')[0].scrollIntoView(true)")
splash:wait(2)
return splash.html()
end
'''
class JDBookSpider(scrapy.Spider):
name = "jd_book"
allowed_domains = ['search.jd.com']
base_url = 'https://search.jd.com/Search?keyword=python&enc=utf-8&wq=python'
def start_requests(self):
yield Request(self.base_url,callback=self.parse_urls,dont_filter=True)
def parse_urls(self,response):
for i in range(20):
url = '%s&page=%s' % (self.base_url,2*i+1)
yield SplashRequest(url,
endpoint='execute',
args={'lua_source':lua_script},
cache_args=['lua_source'])
def parse(self, response):
for sel in response.css('ul.gl-warp.clearfix>li.gl-item'):
pyjdbooks = PyBooksItem()
pyjdbooks['name'] = sel.css('div.p-name').xpath('string(.//em)').extract_first()
pyjdbooks['comment']=sel.css('div.p-commit').xpath('string(.//a)').extract_first()
pyjdbooks['promo_words']=sel.css('div.p-name').xpath('string(.//i)').extract_first()
yield pyjdbooks
jd_book.py
import scrapy class PyBooksItem(scrapy.Item):
name=scrapy.Field()
comment=scrapy.Field()
promo_words=scrapy.Field()
items.py
from fake_useragent import UserAgent
# 随机的User-Agent
class RandomUserAgent(object):
def process_request(self, request, spider):
request.headers.setdefault("User-Agent", UserAgent().random)
middlewares.py
class SplashExamplesPipeline(object):
def __init__(self):
self.book_set = set() def process_item(self, item, spider):
if not(item['promo_words']):
item['promo_words'] = item['name']
comment = item['comment']
if comment[-2:] == "万+":
item['comment'] = str(int(float(comment[:-2])*10000))
elif comment[-1] == '+':
item['comment'] = comment[:-1]
return item import pymysql class MysqlPipeline(object):
def __init__(self, host, database, user, password, port):
self.host = host
self.database = database
self.user = user
self.password = password
self.port = port @classmethod
def from_crawler(cls, crawler):
return cls(
host=crawler.settings.get('MYSQL_HOST'),
database=crawler.settings.get('MYSQL_DATABASE'),
user=crawler.settings.get('MYSQL_USER'),
password=crawler.settings.get('MYSQL_PASSWORD'),
port=crawler.settings.get('MYSQL_PORT'),
) def open_spider(self, spider):
self.db = pymysql.connect(self.host, self.user, self.password, self.database, charset='utf8', port=self.port)
self.cursor = self.db.cursor() def close_spider(self, spider):
self.db.close() def process_item(self, item, spider):
data = dict(item)
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))
sql = 'insert into books (%s) values (%s)' % (keys, values)
self.cursor.execute(sql, tuple(data.values()))
self.db.commit()
return item
pipelines.py
BOT_NAME = 'splash_examples' SPIDER_MODULES = ['splash_examples.spiders']
NEWSPIDER_MODULE = 'splash_examples.spiders' #Splash服务器地址
SPLASH_URL = 'http://192.168.99.100:8050' #开启Splash的两个下载中间件并调整HttpCompressionMiddleware的次序
DOWNLOADER_MIDDLEWARES = {
'splash_examples.middlewares.RandomUserAgent':345,
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
#设置去重过滤器
DUPEFILTER_CLASS='scrapy_splash.SplashAwareDupeFilter' #用来支持cache_args
SPIDER_MIDDLEWARES ={
'scrapy_splash.SplashDeduplicateArgsMiddleware':100,
}
# 使用Splash的Http缓存
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage' # Obey robots.txt rules
ROBOTSTXT_OBEY = False COOKIES_ENABLED = False
DOWNLOAD_DELAY = 3 ITEM_PIPELINES = {
'splash_examples.pipelines.SplashExamplesPipeline':400,
'splash_examples.pipelines.MysqlPipeline':543,
} MYSQL_HOST = 'localhost'
MYSQL_DATABASE = 'pybooks'
MYSQL_PORT = 3306
MYSQL_USER = 'root'
MYSQL_PASSWORD = 'root'
settings.py
在Terminal中执行爬虫:scrapy crawl jd_book -o pybooks.csv
将数据存储到数据库并生成csv文件用于分析可视化
在数据库中查看有1187条信息
做数据分析可视化
import pandas as pd
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
obj = pd.read_csv('pybooks.csv')
Books = obj.sort_values('comment',ascending=False)[:200]
promoWords = []
for promo in Books['promo_words']:
promoWords.append(promo)
promoWordsStr = ''.join(promoWords)
bookTxt = jieba.lcut(promoWordsStr)
stopwords = ['学习','入门','掌握','教程','图书','使用','全面','推荐','读者','专家']
bookTxt = [token for token in bookTxt if token not in stopwords]
bookTxtSet = set(bookTxt)
txtCount = {}
for i in bookTxtSet:
if len(i) == 1:
continue
txtCount[i] = bookTxt.count(i)
txtCount = sorted(txtCount.items(),key=lambda key:key[1],reverse=True)
TxtStr = ' '.join(bookTxt)
ciyun = WordCloud(background_color = '#122',width=400,height=300,margin = 1).generate(TxtStr)
plt.imshow(ciyun)
plt.axis("off")
plt.show()
print(txtCount)
pybook.py
scrapy+splash 爬取京东动态商品的更多相关文章
- Scrapy实战篇(八)之Scrapy对接selenium爬取京东商城商品数据
本篇目标:我们以爬取京东商城商品数据为例,展示Scrapy框架对接selenium爬取京东商城商品数据. 背景: 京东商城页面为js动态加载页面,直接使用request请求,无法得到我们想要的商品数据 ...
- JS+Selenium+excel追加写入,使用python成功爬取京东任何商品~
之前一直是requests库做爬虫,这次尝试下使用selenium做爬虫,效率不高,但是却没有限制,文章是分别结合大牛的selenium爬虫以及excel追加写入操作而成,还有待优化,打算爬取更多信息 ...
- python利用urllib实现的爬取京东网站商品图片的爬虫
本例程使用urlib实现的,基于python2.7版本,采用beautifulsoup进行网页分析,没有第三方库的应该安装上之后才能运行,我用的IDE是pycharm,闲话少说,直接上代码! # -* ...
- 毕设二:python 爬取京东的商品评论
# -*- coding: utf-8 -*- # @author: Tele # @Time : 2019/04/14 下午 3:48 # 多线程版 import time import reque ...
- Scrapy爬虫框架(实战篇)【Scrapy框架对接Splash抓取javaScript动态渲染页面】
(1).前言 动态页面:HTML文档中的部分是由客户端运行JS脚本生成的,即服务器生成部分HTML文档内容,其余的再由客户端生成 静态页面:整个HTML文档是在服务器端生成的,即服务器生成好了,再发送 ...
- 一起学爬虫——使用selenium和pyquery爬取京东商品列表
layout: article title: 一起学爬虫--使用selenium和pyquery爬取京东商品列表 mathjax: true --- 今天一起学起使用selenium和pyquery爬 ...
- Scrapy实战篇(七)之Scrapy配合Selenium爬取京东商城信息(下)
之前我们使用了selenium加Firefox作为下载中间件来实现爬取京东的商品信息.但是在大规模的爬取的时候,Firefox消耗资源比较多,因此我们希望换一种资源消耗更小的方法来爬取相关的信息. 下 ...
- scrapy爬取京东iPhone11评论(一)
咨询行业中经常接触到文本类信息,无论是分词做词云图,还是整理编码分析用,都非常具有价值. 本文将记录使用scrapy框架爬取京东IPhone11评论的过程,由于一边学习一边实践,更新稍慢请见谅. 1. ...
- selenium模块使用详解、打码平台使用、xpath使用、使用selenium爬取京东商品信息、scrapy框架介绍与安装
今日内容概要 selenium的使用 打码平台使用 xpath使用 爬取京东商品信息 scrapy 介绍和安装 内容详细 1.selenium模块的使用 # 之前咱们学requests,可以发送htt ...
随机推荐
- JAVA基础之HttpServletRequest请求
HttpServletRequest请求是获取请求行.请求头和请求体:可以通过这个方法设置防盗链,获取地址.牢记解决乱码的方式. 怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持reques ...
- Web网站实现facebook登录
一.登录facebook开发者中心:https://developers.facebook.com 二.创建应用编号,如下图: 三.添加产品选择Facebook登录,如下图: 四.facebbok登录 ...
- MySQL CentOS7 手动安装
手动安装MySQL的目的: 1.一个服务器上可以同时装多个版本,甚至相同版本MySQL的多个实例,这种需求很常见: 2.一次初始化和配置后,可以快速复制到本服务器或其他服务器,及封装为初始MySQL的 ...
- python笔记--------一
作用域: 每个变量或函数都有自己的作用域. 每个函数都定义了一个命名空间,也称为作用域. 在最顶层有一个符号表会跟踪这一层所有的名称定义和和他们当前的绑定. 调用函数时,会建立一个新的符号表(常称为栈 ...
- jmeter+nmon+crontab简单的执行接口定时压测
一.概述 临时接到任务要对系统的接口进行压测,上面的要求就是:压测,并发2000 在不熟悉系统的情况下,按目前的需求,需要做的步骤: 需要有接口脚本 需要能监控系统性能 需要能定时执行脚本 二.观察 ...
- scrapy框架爬取糗妹妹网站妹子图分类的所有图片
爬取所有图片,一个页面的图片建一个文件夹.难点,图片中有不少.gif图片,需要重写下载规则, 创建scrapy项目 scrapy startproject qiumeimei 创建爬虫应用 cd qi ...
- php的插入排序
感觉在这个数据量上,排入比冒泡要好很多呢~ 代码: <?php /** * 直接插入排序(类比抓牌) * 原理:每次从无序列表中取出第一个元素,把他插入到有序表中的合适位置,使有序表仍然有序 * ...
- Linux UART介绍
1. UART介绍 UART是一类tty设备, 是一种串行端口终端, 具体可参考<UART接口介绍>在Linux中UART属于tty驱动的一部分, 具体实现包括驱动抽象层和硬件实现层 本文 ...
- GSM/GPRS模块 AT指令集C语言编程——基于有方M660+和MSP430单片机
GSM/GPRS芯片是手机中负责收发短信.拨打电话以及访问GPRS网络的核心器件.有方M660+为深圳有方公司生产的一款超小封装的GSM/GPRS工业无线模块,可以提供高品质的语音.短信.数据业务等功 ...
- 看图轻松理解数据结构与算法系列(NoSQL存储-LSM树) - 全文
<看图轻松理解数据结构和算法>,主要使用图片来描述常见的数据结构和算法,轻松阅读并理解掌握.本系列包括各种堆.各种队列.各种列表.各种树.各种图.各种排序等等几十篇的样子. 关于LSM树 ...