目标网页:
游戏列表页

游戏详情页

游戏评论

目标数据:
列表页:游戏标题,游戏价格,折扣,评论总数,好评比例,游戏发布时间
详情页:游戏图片,游戏简介,游戏评论

首先创建一个scrapy项目

根据规律构造列表页的请求地址


分析标签,抓取数据

标题↑,价格↓

列表页解析函数

测试打印第一条数据

然后开始构建详情页请求(这里一定要加accept-language这个请求头,不然会返回英文页面)


详情页的解析函数

测试打印数据

接下来获取游戏评论

游戏评论没有和主页面一起加载,通过分析网络请求,发现了评论的请求地址

此地址需要传入参数,经过测试,至少需要这几个参数

里面的730为游戏id,可以通过正则从详情页地址中获取,后面两个参数设置为筛选中文评论

继续刚才的代码↓

发起评论页请求

回调到评论的解析函数

因为返回的是json数据,所以不能再用selector对象提取。这里的思路是先从response里获取内容,然后用json转成字典,从字典中取出html,再用xpath提取数据
这里直接用xpath提取出来的评论包含很多空格,有些还是空评论,所以加条件处理了一下。

打印一下评论列表

提取代码写完后,修修改pipline文件,把数据保存到mongodb

查看数据库

评论信息

这里发现评论有点问题,本来是一条评论被拆成了好几条数据存,查看html源码

发现可能是标签套标签的缘故,xpath提取的不好,改用beautifulsoup
重写提取部分的代码

打印

大段评论成功合成一条数据
查看数据库

开始测试批量爬取

大部分没有问题,但是有些数据的价格没有爬到

查看原网页

发现可能是因为价格打折的原因,使得标签不一样了
修改提取规则,增加判断条件

这样价格有折扣的话,也可以正常获取了

爬取过程中还发现了其他问题,

这种情况,价格和评论缺失

或者这种情况,只能提取到一个标题

为了防止因为数据缺失造成程序报错终止,在数据解析的部分加入了异常处理

使用try-except捕获异常,打印异常原因。

爬取过程中,还出现了列表页的detail_url提取不到的情况,因此在发送详情页请求前加入了异常捕获。
如果请求异常,将request对象设置为空提交给引擎。
然后修改引擎的爬虫中间件,加一个判断,如果收到空置,就跳过,不交给解析组件。

最后爬取完毕


总共1185条数据

完整代码:
game.py

# -*- coding: utf-8 -*-
import html
import json
import scrapy
from ..items import SteamItem
import re
from bs4 import BeautifulSoupclass GameSpider(scrapy.Spider):name = 'game'allowed_domains = ['store.steampowered.com']# 生成列表页urlstart_urls = []base_url = 'https://store.steampowered.com/search/?category1=998&page={}'for page in range(1, 1239):start_urls.append(base_url.format(page))# breakdef parse(self, response):a_list = response.xpath('//*[@id="search_result_container"]/div[2]/a')for a in a_list:item = SteamItem()# 统一设置默认值item["game_name"] = ''item["release_date"] = ''item["game_price"] = ''item["game_review"] = ''item["game_summary"] = ''item["game_img"] = ''item["review_list"] = ''detail_link = a.xpath('./@href').extract()[0]try:game_name = a.xpath('./div[2]/div/span/text()').extract()[0]release_date = a.xpath('./div[2]/div[2]/text()').extract()[0]game_price = a.xpath('./div[2]/div[4]/div[2]/text()').extract()[0].strip() # 如果是正常价格if not game_price:      # 看看是否是打折价格game_price = a.xpath('./div[2]/div[4]/div[2]/span/strike/text()').extract()[0].strip()price_discount = a.xpath('./div[2]/div[4]/div[1]/span/text()').extract()[0].strip()    # 如果有打折,提取折扣力度else:price_discount = '-0%'item["game_name"] = game_nameitem["release_date"] = release_dateitem["game_price"] = game_priceitem["price_discount"] = price_discountexcept Exception as e:print('名字/发布时间/价格/折扣 缺失')print(e)print('detail_link', detail_link)continue# 请求详情页detail_request = scrapy.Request(url=detail_link,callback=self.detail_parse,headers={"Accept-Language": "zh-CN,zh;q=0.9","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"},meta={"item": item, 'detail_link': detail_link},)yield detail_requestbreakdef detail_parse(self, response):item = response.meta["item"]detail_link = response.meta["detail_link"]try:game_summary = response.xpath('//div[@class="game_description_snippet"]/text()').extract()[0].strip()game_review = response.xpath('//div[@class="user_reviews"]/div[2]/@data-tooltip-html').extract()[0]game_img = response.xpath('//img[@class="game_header_image_full"]/@src').extract()[0]item["game_review"] = game_reviewitem["game_summary"] = game_summaryitem["game_img"] = game_imgexcept Exception as e:print('简介/评论/图片 缺失')print(e)# 生成评论页urltry:game_id = re.search('https://store.steampowered.com/app/(\d+)/.*?', detail_link).group(1)review_url = "https://store.steampowered.com/appreviews/{}?filter=summary&language=schinese&l=schinese".format(game_id)# 请求评论页review_request = scrapy.Request(url=review_url,callback=self.review_parse,headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36"},meta={"item": item},)except Exception as e:print('正则', detail_link)print(e)review_request = ''yield review_requestdef review_parse(self, response):item = response.meta["item"]review_list = []try:# 获取json数据中的html文本data = response.textdata_dict = json.loads(data)data_html = html.unescape(data_dict["html"])#  构建bs4对象soup = BeautifulSoup(data_html, 'lxml')div_list = soup.select('div[class="content"]')for div in div_list:review = div.get_text()rev = review.strip()if rev:review_list.append(rev)except Exception as e:print('评论缺失,无法解析')print(e)item["review_list"] = review_listyield item

pipelines.py

import pymongoclass SteamPipeline(object):def open_spider(self, spider):self.client = pymongo.MongoClient(host='127.0.0.1', port=27017)self.db = self.client.steamdef process_item(self, item, spider):self.db.games.insert(dict(item))return item

middlewars.py

from scrapy import signalsclass SteamSpiderMiddleware(object):def process_spider_output(self, response, result, spider):# Called with the results returned from the Spider, after# it has processed the response.# Must return an iterable of Request, dict or Item objects.for i in result:if i:       # 尝试跳过url为空的请求yield i

items.py

import scrapyclass SteamItem(scrapy.Item):# define the fields for your item here like:game_name = scrapy.Field()release_date = scrapy.Field()game_review = scrapy.Field()game_price = scrapy.Field()game_summary = scrapy.Field()game_img = scrapy.Field()review_list = scrapy.Field()price_discount = scrapy.Field()

settings.py


ITEM_PIPELINES = {'steam.pipelines.SteamPipeline': 300,
}

python scrapy 爬取steam游戏相关推荐

  1. 英文名看不懂?爬取steam游戏中文优惠信息

    需求分析 昨天,我发布了爬取steam游戏优惠信息的程序,可是呢,很快啊,有一个年轻人找到我说,"仙老师,你这个程序我用了,有问题!" 我立刻问到,"发生甚么事了,我说这 ...

  2. Python scrapy爬取京东,百度百科出现乱码,解决方案

    Python scrapy爬取京东 百度百科出现乱码 解决方案 十分想念顺店杂可... 抓取百度百科,出现乱码 把页面源码下载下来之后,发现全是乱码,浏览器打开 但是浏览器链接打开就没有乱码 以下是浏 ...

  3. Python+scrapy爬取36氪网

    Python+Scrapy爬取36氪网新闻 一.准备工作: ​ ①安装python3 ​ ②安装scrapy ​ ③安装docker,用来运行splash,splash是用来提供js渲染服务(pyth ...

  4. 基于steam的游戏销量预测 — PART 1 — 爬取steam游戏相关数据的爬虫

    语言:python 环境:ubuntu 爬取内容:steam游戏标签,评论,以及在 steamspy 爬取对应游戏的销量 使用相关:urllib,lxml,selenium,chrome 解释: 流程 ...

  5. 如何用 Python + Scrapy 爬取视频?

    今天将带大家简单了解Scrapy爬虫框架,并用一个真实案例来演示代码的编写和爬取过程. 一.scrapy简介 1. 什么是Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框 ...

  6. 手把手教你使用Python+scrapy爬取山东各城市天气预报

    1.在命令提示符环境使用pip install scrapy命令安装Python扩展库scrapy,详见Python使用Scrapy爬虫框架爬取天涯社区小说"大宗师"全文 2.使用 ...

  7. python scrapy爬取HBS 汉堡南美航运公司柜号信息

    下面分享个scrapy的例子 利用scrapy爬取HBS 船公司柜号信息 1.前期准备 查询提单号下的柜号有哪些,主要是在下面的网站上,输入提单号,然后点击查询 https://www.hamburg ...

  8. python Scrapy爬取天气预报,零基础的你也可以快速上手

    目的 写一个真正意义上一个爬虫,并将他爬取到的数据分别保存到txt.json.已经存在的mysql数据库中. 目标分析: 初学者有什么不懂的可以私信我--我刚整理了一套2021最新的0基础入门教程,无 ...

  9. 使用python scrapy爬取全国小区信息(包括小区价格,经纬度,面积,户数等),并保存到mysql和excel

    目标 此次爬取的网站是楼盘网,因为只爬取小区信息,所以先从深圳小区(http://sz.loupan.com/community/)网页入手分析,然后发散爬取至全国. 爬取的信息包括 省,所属市,所属 ...

  10. python scrapy爬取豆瓣即将上映电影用邮件定时推送给自己

    本文不是python.scrapy的教程,而是分享一个好玩的点子. python教程请看python教程,scrapy教程请看scrapy教程 爬取豆瓣高分电影教程参考python爬虫入门笔记:用sc ...

最新文章

  1. SQL server 2005中无法新建作用(Job)的问题
  2. 用C#实现计算机图形学算法
  3. Python-OpenCV 处理图像(六)(七)(八):对象识别 图像灰度化处理 图像二值化处理
  4. 6.2 gzip:压缩或解压文件
  5. 【python数据挖掘课程】十三.WordCloud词云配置过程及词频分析
  6. 用Eclipse进行C/C++开发
  7. C语言程序设计--输入与输出
  8. 13张PPT带你了解主动式消息队列处理集群
  9. java corepoolsize_理解ThreadPoolExecutor线程池的corePoolSize、maximumPoolSize和poolSize
  10. div table 超出了_div包裹的table,table的宽度超出了的宽度,出现的滚动条的在windows下无法拖动...
  11. 《Java技术》第一次作业
  12. 关于计算机的英语作文八百字,小学英语作文800字(精选10篇)
  13. 以下各节已定义,但尚未为布局页“~/Views/_LayoutHome.cshtml”呈现:“mainContent; jsSrc”。...
  14. HTML、 CSS、 JavaScript三者的关系
  15. RocketMQ : MQClientException: producerGroup can not equal DEFAULT_PRODUCER, please specify another
  16. 计算机安装pdf打印机驱动,win7电脑安装pdf虚拟打印机,教您安装方法
  17. 解决加载libqxcb.so失败以及Linux库搜索顺序
  18. 吉米_王:MySQL开启log_bin日志,误删数据库时你最后的救命稻草
  19. 奖补不要错过!2022年四川省18地市高新技术企业奖励补贴政策及申报条件汇编!
  20. 如何用transition实现翻书动画效果

热门文章

  1. 下载c语言软件在哪里,下载c语言编程软件-c语言编程软件去哪里下?c语言编程软件去哪 – 手机爱问...
  2. EXCEL2007导入SQL生成新表并插入数据
  3. c语言程序设计双语版答案,C程序设计(双语版)习题答案.doc
  4. 防火墙资源(jetio,comodo,outpost,pc tool,zonealarm pro
  5. python 获取网页特定图片并保存至本地
  6. ubuntu给手机刷机安卓8.0 ROOT+Xposed+JustTrustMe+Kali NetHunter
  7. xp系统能安装32位的python吗-32位XP系统 Python3.4.4安装scrapy1.6.0
  8. python数据可视化常用工具推荐
  9. java制作摇奖系统_基于Java实现抽奖系统
  10. [网络工程师]-路由配置-OSPF配置