最近有在做小学期的项目,用scrapy实现爬取图书,下面是我实现的过程。
具体实现功能有:二级页面带自动翻页功能,三级页面的第一页爬取,大小类别的区分。
框架:scrapy
使用到chrome的插件:Selenium
插件的链接:chromediver提权码:5n0l。解压后将他丢入C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe(这是我的路径可以参考下)
数据库:mongoDB
三级页面请看我另外一篇文章:https://blog.csdn.net/weixin_43094046/article/details/107933101

二级页面带自动翻页功能

首先需要在对应的页面下创建scrapy项目这里我们选择创建两个一个叫myProject用于测试xpath因为后期一旦启动项目就开始爬取费时,一个叫suningBook具体实现二级页面带自动翻页功能。
目录:

废话不多说,直接开淦。
首先选取爬取的页面这里我选择的是小说部分链接:苏宁图书小说
分析页面定位到一整本书

然后下面的价格,书名,店铺,评价人数,链接(作为我们跳转的依据)是需要爬取的,这里就不考虑图片了。二级页面中的作者,出版社,出版时间。
在items中定义

import scrapy
class SuningbookItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()id=scrapy.Field()#出版时间bkName=scrapy.Field()#图书的名字price=scrapy.Field()#图书的价格commenrNumber=scrapy.Field()#评价的人数bkShop=scrapy.Field()#所在的书店bkUrl=scrapy.Field()#URLauthor=scrapy.Field()#作者press=scrapy.Field()#出版社publishTime=scrapy.Field()#出版时间

在爬取的时候没有考虑数据类型全是字符串,后期在做处理。
写具体爬虫方法

from copy import deepcopy #这里是考虑了数据丢失问题,不然二级页面中数据无法获取import scrapyclass SuningspiderSpider(scrapy.Spider):name = 'suningSpider'allowed_domains = ['suning.com']start_urls = ['https://list.suning.com/1-502320-0.html']def parse(self, response):book_lists = response.xpath('//div[@id="filter-results"]/ul/li')print(len(book_lists))item = {}count = 0for book in book_lists:#遍历图书item['id'] = count+1 #做一个计数器item['bkName'] = book.xpath('.//div[@class="res-info"]/p[2]/a/text()').extract_first()price1 = str(book.xpath('.//div[@class = "res-info"]/p[1]/em/text()').extract_first())price2 = str(book.xpath('//*[@id="filter-results"]/ul/li[1]/div/div/div/div[2]/p[1]/em/i[1]/text()').extract_first())item["price"] = price1 + price2 #价格拼接item['commentNumber'] = book.xpath('.//div[@class="res-info"]/p[3]/a[1]/text()').extract_first()item['bkShop'] = book.xpath('.//div[@class="res-info"]/p[4]/a[1]/text()').extract_first()item['bkUrl'] = "https:" + book.xpath('.//div[@class="res-info"]/p[2]/a[1]/@href').extract_first()yield scrapy.Request(item["bkUrl"], callback=self.parse_detail, meta={"item": deepcopy(item)}) #根据所获取到的url做跳转count = count + 1def parse_detail(self, response):item = response.meta["item"]item["author"] = response.xpath('//li[@class="pb-item"][1]/text()').extract_first() if response.xpath('//li[@class="pb-item"][1]/text()').extract_first() is not None else "未知"item["press"] = response.xpath('//li[@class="pb-item"][2]/text()').extract_first() if response.xpath('//li[@class="pb-item"][2]/text()').extract_first() is not None else "未知"item["publishTime"] = response.xpath('//li[@class="pb-item"][3]/span[2]/text()').extract_first() if response.xpath('//li[@class="pb-item"][3]/text()').extract_first() is not None else "未知"yield itemprint(item)

这里的xpath都是通过myProject测试后填写
接下来我们需要翻页所有就使用到了Selenium上文有链接。在middleware中写对应使用的方法,这里我只考虑翻三页。

class SeleniumDownloaderMiddleware:"""构造方法"""def __init__(self):self.browser = webdriver.Chrome(r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe')  # 每个spider初始化一次driver,自己的Chromedriver路径"""动态网页处理中间件"""def process_request(self, request, spider):#普通selenium的使用if spider.name == 'suningSpider'and not (request.url.startswith("https://product")):# 根据特定Spider 决定是否利用selenium模拟浏览器爬取self.browser.get(request.url)  # selenium请求了网页 获得的Response 因此process_request不需要再返回Request给Downloadertime.sleep(5)  # 延时5s 待网页完全加载后打印html文本print("访问:", request.url)print("current_url", self.browser.current_url)urlchangecnt = 0body = ""while (urlchangecnt < 3) :self.browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')#这里下滑是因为进入页面只有30本书,要想得到整个页面的图书就需要下滑到底端动作,则数据是60本书time.sleep(5)#等待页面加载body = body + self.browser.page_sourceself.browser.find_element_by_id('nextPage').send_keys(Keys.ENTER)urlchangecnt = urlchangecnt + 1return HtmlResponse(self.browser.current_url, body=body,encoding="utf-8", request=request)  # 这里必须返回Response的类或派生类#只有这样Scrapy才不会返回Request给Downloader

pipelines中去填写导入数据库的方法,以及数据的清洗

import pymongo
from scrapy.utils.project import get_project_settings
settings = get_project_settings()
class SuningbookPipeline:def __init__(self):host=settings['MONGODB_HOST']port=settings['MONGODB_PORT']db_name=settings['MONGODB_DBNAME']client=pymongo.MongoClient(host=host,port=port)db=client[db_name]self.post=db[settings['MONGODB_DOCNAME']]def process_item(self, item, spider):item["bkName"]=item["bkName"].strip()item["commentNumber"]=item["commentNumber"].strip('+')item["author"]=item["author"].strip()item["press"]=item["press"].strip()book_info=dict(item)self.post.insert(book_info)return item

重要的是在settings里面进行整个项目的配置

BOT_NAME = 'suningBook'SPIDER_MODULES = ['suningBook.spiders']
NEWSPIDER_MODULE = 'suningBook.spiders'MONGODB_HOST='127.0.0.1' #数据库地址
MONGODB_PORT=27017
MONGODB_DBNAME='suning' #数据库名
MONGODB_DOCNAME='book_info' #集合的名字
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'suningBook (+http://www.yourdomain.com)'# Obey robots.txt rules
ROBOTSTXT_OBEY = False #
LOG_LEVEL = 'WARNING' #为了使得控制台输出整洁调整了输出的等级,并且报错会在本地生产log。txt的文件
LOG_FILE = 'log.txt'
CONCURRENT_REQUESTS = 100
COOKIES_ENABLED = False
RETRY_ENABLED = False
DOWNLOAD_TIMEOUT = 3#下端找到Middleware,pipelins的配置(默认是注释了的),将插件的优先度调整到最高
DOWNLOADER_MIDDLEWARES = {'suningBook.middlewares.SuningbookDownloaderMiddleware': 543,'suningBook.middlewares.SeleniumDownloaderMiddleware': 1,
}ITEM_PIPELINES = {'suningBook.pipelines.SuningbookPipeline': 300,
}
#这里是做数据输出的缓冲,就不需要在Middleware中数据的睡眠了,使得数据输出完整。
AUTOTHROTTLE_ENABLED = True

遇到的问题:

  1. 数据丢失
  2. 数据爬取过慢
  3. 无法翻页

解决方法:

  1. settings中设置AUTOTHROTTLE_ENABLED = True以及爬虫中的decopy还有我在获取数据中发现数据库中一直都是177条,三页数据本该180条,我就在suningSpider里面第一个函数做item条数输出,发现是180条则我就想是不是这里传给pip出问题还是pip传给数据库出现问题,则我又在pip中打印item。发现数据少了三条就确定了是suningSpider中yield传递的时候出现问题。然后我就在控制台一个id一个ID找发现这个9号并没有在控制台输出,具体到页面上去看发现他的作者和出版时间没有,这样就导致了我的数据丢失,所以就在函数中做了个判断,如果没有的话就填写“未知”,这样的我数据180条就正确了。下面是有问题的图书,只有一个li标签。

  2. 在SeleniumDownloaderMiddleware中写了一个判断并不需要具体的每一本输还有进行跳转然后睡眠,只需要获取数据就行and not (request.url.startswith(“https://product”))。以及在settings中CONCURRENT_REQUESTS = 100,并行的数据。

  3. 老师提供的是定位然后点击.click()下一页按钮,发现总是不能,于是我就在网上搜搜.send_keys(Keys.ENTER)发现这个方法模拟键盘回车,能够成功。为了弄清楚,就又尝试了下,发现这个cilck的id定位确实有点问题,用xpath来就行。

以下是数据库截图


整个项目:https://pan.baidu.com/s/1hOR4xJd8JLA_seu9ZwNz8A
提取码:e0zd

python实现二级页面带自动翻页功能,三级页面爬虫苏宁图书。相关推荐

  1. python实现翻_python实现模拟按键,自动翻页看u17漫画

    python实现模拟按键,自动翻页看u17漫画 发布于 2015-10-22 08:23:25 | 134 次阅读 | 评论: 0 | 来源: 网友投递 Python编程语言Python 是一种面向对 ...

  2. html分页自动加载,AutoPagerize插件,网页自动翻页插件,自动加载分页网站

    AutoPagerize,是一款可以实现网页自动翻页的浏览器插件,该插件会自动缓存下一页网页,将翻页式的内容变为瀑布流的形式,无需手动点击翻页,即可自动链接到下一页. 用于自动加载分页网页的浏览器扩展 ...

  3. 【电子刊物制作软件】名编辑电子杂志大师教程 | 自动翻页设置

    名编辑电子杂志大师具有自动翻页的功能,更便于读者阅读.请看下面教程: 第一步.在编辑窗口的"设计设置"面板中找到"自动翻页",或直接搜索功能关键词,在 里直接输 ...

  4. 计算机文档翻页怎么设置,Word文档如何设置自动翻页?

    在网上阅读一篇长篇小说时,或者浏览一段长篇文档时.最折磨人的就是手要一直用鼠标上来回滚动翻页.时间长了特别累人.那我们在Word阅读像论文这类的长篇文档时也会遇到这种情况.不过在word中除了鼠标我们 ...

  5. 怎么设置html自动翻页,看小说怎么设置自动翻页 设置自动翻页方法介绍

    多看阅读器R7.4 Kindle4 版 类型:阅读工具大小:68.2M语言:中文 评分:10.0 标签: 立即下载 现在很多人都喜欢在手机上看小说,在手机阅读软件中看书的时候,为了减少烦人的操作,想设 ...

  6. qtablewidget翻页禁止_PyQt—QTableWidget实现翻页功能

    主要使用QTableWidget中的三个函数实现: verticalScrollBar().setSliderPosition() 设置当前滑动条的位置 verticalScrollBar().max ...

  7. 前端Vue书籍翻页功能利用turn.js来完成以及知识点(源码)

    目录 下载 文档 开始 构造方法 可配置项 方法 语法 事件 两种方式添加事件 自动翻页loading加载功能 案例 CSS basic.css源码如下 JS里面代码太多了,直接官网下载 index. ...

  8. 用 Python selenium爬取股票新闻并存入mysql数据库中带翻页功能demo可下载

    用 Python selenium爬取实时股票新闻并存入mysql数据库中 1.分析需求 2.创建表 3.分析需要爬取的网页内容 4.python里面selenium进行爬虫操作 1.添加包 2.连接 ...

  9. 抓取安居客二手房经纪人数据,python爬虫自动翻页

    为什么80%的码农都做不了架构师?>>>    和链接不一样,安居客网站里面没有找到总页数,可能在json里面有,只是我没有找到. 基于此能不能做网页的循环爬取呢. 能否判断页面读取 ...

最新文章

  1. NSHelper.showAlertTitle的两种用法 swift
  2. asch相关的linux基础知识分享
  3. ASP.NET Core 中文文档 第三章 原理(12)托管
  4. 五十四、Java日期Date,LocalDate类以及格式化输出
  5. CF1368G Shifting Dominoes(扫描线求矩阵的并集)
  6. mysql+after+commit_P8级面试难题,after_sync vs after_commit,哪个性能更好?
  7. UI界面设计视觉设计参考模板,解剖分层看如何更好的运用排版法则
  8. 打通高德、UC、微博,支付宝小程序组建“阿里联盟军”对抗微信小程序?| 技术头条...
  9. 第十六章:SpringCloud Config 配置自动刷新
  10. csdn博客搬家:及其方便的博客迁移、搬家工具,支持主流博客平台----CsdnSyncHexo。
  11. 只用一招!Python实现微信防撤回!
  12. OMNeT 例程 Tictoc16 学习笔记
  13. 301work 不积跬步无以至千里Asp.net程序
  14. 为什么有人愿意将软件开源和共享?
  15. 基于51单片机的篮球记分牌设计
  16. 虚幻引擎图文笔记:使用布料模拟(Cloth Simulation)系统制作一面可以随风飘动的旗帜(更新)
  17. 博弈论与信息经济学-重复博弈
  18. c语言输入任意长度字符串,读取不定长字符串输入
  19. 未越狱设备 安装ipa
  20. 自然语言处理——文本分类概述

热门文章

  1. XP下神奇缩略图的原因
  2. 用Tensorflow重现YOLO V4
  3. AI+影像赛道开启,美图在人工智能领域如何「名利双收」?
  4. java成员变量/局部变量
  5. 基于MATLAB的药物扩散仿真系统设计与实现 文档+上机实验报告+项目源码+运行说明
  6. MFC之GDI GDI+ 编程实例剖析
  7. 华为java机试题限时多久_年薪35万的华为机试题,你完成需要多长时间?
  8. mapboxGL2中Terrain的离线化应用
  9. Deep Reinforcement Learning超简单入门项目 Pytorch实现接水果游戏AI
  10. 云化时代,中建信息携手绿盟科技助力企业重构安全能力体系