作业来源: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 爬取京东动态商品的更多相关文章

  1. Scrapy实战篇(八)之Scrapy对接selenium爬取京东商城商品数据

    本篇目标:我们以爬取京东商城商品数据为例,展示Scrapy框架对接selenium爬取京东商城商品数据. 背景: 京东商城页面为js动态加载页面,直接使用request请求,无法得到我们想要的商品数据 ...

  2. JS+Selenium+excel追加写入,使用python成功爬取京东任何商品~

    之前一直是requests库做爬虫,这次尝试下使用selenium做爬虫,效率不高,但是却没有限制,文章是分别结合大牛的selenium爬虫以及excel追加写入操作而成,还有待优化,打算爬取更多信息 ...

  3. python利用urllib实现的爬取京东网站商品图片的爬虫

    本例程使用urlib实现的,基于python2.7版本,采用beautifulsoup进行网页分析,没有第三方库的应该安装上之后才能运行,我用的IDE是pycharm,闲话少说,直接上代码! # -* ...

  4. 毕设二:python 爬取京东的商品评论

    # -*- coding: utf-8 -*- # @author: Tele # @Time : 2019/04/14 下午 3:48 # 多线程版 import time import reque ...

  5. Scrapy爬虫框架(实战篇)【Scrapy框架对接Splash抓取javaScript动态渲染页面】

    (1).前言 动态页面:HTML文档中的部分是由客户端运行JS脚本生成的,即服务器生成部分HTML文档内容,其余的再由客户端生成 静态页面:整个HTML文档是在服务器端生成的,即服务器生成好了,再发送 ...

  6. 一起学爬虫——使用selenium和pyquery爬取京东商品列表

    layout: article title: 一起学爬虫--使用selenium和pyquery爬取京东商品列表 mathjax: true --- 今天一起学起使用selenium和pyquery爬 ...

  7. Scrapy实战篇(七)之Scrapy配合Selenium爬取京东商城信息(下)

    之前我们使用了selenium加Firefox作为下载中间件来实现爬取京东的商品信息.但是在大规模的爬取的时候,Firefox消耗资源比较多,因此我们希望换一种资源消耗更小的方法来爬取相关的信息. 下 ...

  8. scrapy爬取京东iPhone11评论(一)

    咨询行业中经常接触到文本类信息,无论是分词做词云图,还是整理编码分析用,都非常具有价值. 本文将记录使用scrapy框架爬取京东IPhone11评论的过程,由于一边学习一边实践,更新稍慢请见谅. 1. ...

  9. selenium模块使用详解、打码平台使用、xpath使用、使用selenium爬取京东商品信息、scrapy框架介绍与安装

    今日内容概要 selenium的使用 打码平台使用 xpath使用 爬取京东商品信息 scrapy 介绍和安装 内容详细 1.selenium模块的使用 # 之前咱们学requests,可以发送htt ...

随机推荐

  1. springCloud学习笔记2(服务发现)

    本篇代码存放于:https://github.com/FleyX/demo-project/tree/master/springcloud/spring-cloud%E6%9C%8D%E5%8A%A1 ...

  2. 基于webpack的前端工程化开发解决方案探索(三):webpack-dev-server

    前两篇中我们使用webpack完成了静态资源(css/js/img)等自动写入HTML模板中,同时还可以为静态资源添加hash版本号,既满足了我们对于静态资源的打包要求,同时又无需开发人员介入打包过程 ...

  3. Leetcode刷题python

    Two Sum 两数==target 方法二更好 题1,对时间复杂度有要求O(n),所以维护一个字典,遍历过的数值放在字典中,直接遍历时候查找字典中有没有出现差,查找字典时间复杂度是O(1),所以O( ...

  4. 一些常用的 Emoji 符号(可直接复制)

    表情类

  5. windows下binlog问题解决

    1.先确定mysql是否开启了binlog show binary logs; 默认情况下是不开启的 2.如何开启 在my.ini配置下添加两个参数 # Binary Logginglog-bin=m ...

  6. Java Excel报表导出Demo

    /** * 一级权限数据导出 * @return */ @RequestMapping(value = "/getExportData", method = RequestMeth ...

  7. 多线程之美6一CAS与自旋锁

    1.什么是CAS CAS 即 compare and swap 比较并交换, 涉及到三个参数,内存值V, 预期值A, 要更新为的值B, 拿着预期值A与内存值V比较,相等则符合预期,将内存值V更新为B, ...

  8. GCC编译流程浅析

    GCC-GCC编译流程浅析 序言 对于大多数程序员而言,大家都知道gcc是什么,但是如果不接触到linux平台下的开发,鲜有人真正了解gcc的编译流程,因为windows+IDE的开发模式简直是一条龙 ...

  9. springboot整合mybatis及封装curd操作-配置文件

    1 配置文件  application.properties  #server server.port=8090 server.address=127.0.0.1 server.session.tim ...

  10. 美好的童年伙伴:360 智能儿童手表 P1体验评测

    写在前面 少年儿童作为祖国的花朵,未来的栋梁,也是我们每个做家长的心头肉.近年来各种新闻报道中校园欺凌.虐待事件频发,虽然依然只是个别事件,但我们依然会心怀担忧. 360作为安防软件起家的专业公司,凭 ...