大数据采集与预处理技术(微课版)课件 4.5图书信息数据采集scrapy采集程序设计_第1页
大数据采集与预处理技术(微课版)课件 4.5图书信息数据采集scrapy采集程序设计_第2页
大数据采集与预处理技术(微课版)课件 4.5图书信息数据采集scrapy采集程序设计_第3页
大数据采集与预处理技术(微课版)课件 4.5图书信息数据采集scrapy采集程序设计_第4页
大数据采集与预处理技术(微课版)课件 4.5图书信息数据采集scrapy采集程序设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

大数据采集与预处理技术*

*项目二图书信息数据采集与预处理序号软件配置要求1scrapy最新版本2Scripy-redis最新版本一、项目目标:1、完成图书信息数据分布式采集环境安装配置;2、完成图书信息数据采集程序设计和数据采集;3、完成图书信息数据预处理清洗。4、完成图书信息数据文本标注。二、环境要求:任务一分布式采集环境安装配置一、任务目标1、掌握Scrapy和Scrapy-redis组件的安装配置方法;2、了解Scrapy的工作机制和常见程序编写;3、会使用Scrapy-redis编写数据抓取程序;4、掌握常见的自然语言公开数据集获取方法;5、编写分布式爬虫程序完成图书信息数据采集。1、创建项目在命令行中使用scrapy命令创建一个doubanproject项目。命令如下所示:

scrapystartprojectdoubanproject切换到doubanproject项目,使用如下命令生成爬虫doubanbook程序:

scrapygenspiderdoubanbook2、确定爬虫字段本次爬取的图书信息数据将为以后各类模型训练使用,因此尽可能爬取图书相关字段,例如“书名”、“缩略图URL”、“作者”、“出版社”、“出版时间”、“评论数量”、“小简介”、“子连接”、“评分”、“简介”、“作者简介”、“书的相关标签”。3、定义item#在items.py文件中定义importscrapyclassDoubanprojectItem(scrapy.Item): #definethefieldsforyouritemherelike:#name=scrapy.Field() passclassBookItem(scrapy.Item): book_name=scrapy.Field() #书名 book_img_url=scrapy.Field() #书的缩略图 book_author=scrapy.Field() #作者 book_publisher=scrapy.Field() #出版社 book_publish_time=scrapy.Field() #出版时间 book_grade=scrapy.Field() #评论数量 book_description=scrapy.Field() #小简介 book_son_url=scrapy.Field() #子连接 book_score=scrapy.Field() #评分 book_introduction=scrapy.Field() #简介 book_author_introduction=scrapy.Field() #作者简介 book_labels=scrapy.Field() #书的相关标签4、图书字段xpath筛选书名: //li[@class="subject-item"]/div[2]/h2/a@title书的缩略图: //li[@class="subject-item"]/div[1]/a/img@src作者: //li[@class="subject-item"]/div[2]/div[1]/text(),格式是“作者/出版社/出版时间”出版社: //li[@class="subject-item"]/div[2]/div[1]/text()出版时间: //li[@class="subject-item"]/div[2]/div[1]/text()评论数量: //li[@class="subject-item"]//span[@class="pl"]/text()小简介: //li[@class="subject-item"]//p/text()子连接: //li[@class="subject-item"]//h2/a/@href评分: //*[@id="interest_sectl"]/div/div[2]/strong/text(),子连接页面中,下同简介: //*[@id="content"]/div/div[1]/div[3]/div[3]/div/div/p/text()作者简介: //*[@id="content"]/div/div[1]/div[3]/div[2]/div/div/p/text()书的相关标签://div[@id="db-tags-section"]/div/span/a/text()5、编写pipeline#需要安装mysql-connector-pythonimportmysql.connectorfrommysql.connectorimportError#定义itempipelineclassDoubanprojectPipeline:#定义数据库连接def__init__(self):self.cursor=Noneself.connection=Nonedefopen_spider(self,spider):#设置据库链接相关参数

try:self.connection=mysql.connector.connect(host=spider.settings.get('MYSQL_HOST'),database=spider.settings.get('MYSQL_DATABASE'),user=spider.settings.get('MYSQL_USER'),password=spider.settings.get('MYSQL_PASSWORD'))self.cursor=self.connection.cursor()#开启数据库游标 #创建数据库表

#创建数据库表

self.cursor.execute("""CREATETABLEIFNOTEXISTSitems(idINTAUTO_INCREMENTPRIMARYKEY,book_nameVARCHAR(255),book_img_urlVARCHAR(512),book_authorVARCHAR(255),book_publisherVARCHAR(255),book_publish_timeVARCHAR(255),book_gradeVARCHAR(255),book_descriptionVARCHAR(512),book_son_urlVARCHAR(255), book_scoreVARCHAR(255),book_introductionVARCHAR(512),book_author_introductionVARCHAR(512),book_labelsVARCHAR(255));""")exceptErrorase:spider.logger.error(f"ErrorconnectingtoMySQL:{e}")5、编写pipeline

#关闭爬虫时的相关操作

defclose_spider(self,spider):ifself.connection.is_connected():self.cursor.close()#关闭游标

self.connection.close()#关闭链接

#定义数据存储方法

defprocess_item(self,item,spider):#执行数据库插入

self.cursor.execute("""INSERTINTOitems(book_name,book_img_url,book_author,book_publisher,book_publish_time,book_grade,book_description,book_son_url,book_score,book_introduction,book_author_introduction,book_labels)VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)""",(item['book_name'],item['book_img_url'],item['book_author'],item['book_publisher'],item['book_publish_time'],item['book_grade'],item['book_description'],item['book_son_url'],item['book_score'],item['book_introduction'],item['book_author_introduction'],item['book_labels']))#事务提交

mit()returnitem6、设置settings通常在settings文件中需要设置反爬机制,例如构造爬虫user-agent、并发配置、启用cookies等,由于豆瓣读书确实做了一定反爬机制,因此需要增加相应设置。由于需要启用scrapy-redis和中间件,因此需要在settings.py文件中添加相应的配置。由于数据要保存到数据库,因此还需要设置数据库相关配置。示例如下:#工程名称BOT_NAME="doubanproject"#默认生成配置SPIDER_MODULES=["doubanproject.spiders"]NEWSPIDER_MODULE="doubanproject.spiders"

#默认的Scrapy设置ROBOTSTXT_OBEY=True

#设置并发请求数10CONCURRENT_REQUESTS=10#设置每次请求间隔(秒)DOWNLOAD_DELAY=3#设置单个域名并发请求数量8CONCURRENT_REQUESTS_PER_DOMAIN=8#设置单个IP并发请求数量16CONCURRENT_REQUESTS_PER_IP=16

#启用cookiesCOOKIES_ENABLED=False#构造请求头信息DEFAULT_REQUEST_HEADERS={'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/534.57.2(KHTML,likeGecko)Version/5.1.7Safari/534.57.2',"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Language":"en",}#启用spider中间件SPIDER_MIDDLEWARES={"doubanproject.middlewares.DoubanprojectSpiderMiddleware":543,}#启用下载中间件DOWNLOADER_MIDDLEWARES={"doubanproject.middlewares.DoubanprojectDownloaderMiddleware":543,}#部分默认设置REQUEST_FINGERPRINTER_IMPLEMENTATION="2.7"TWISTED_REACTOR="ernet.asyncioreactor.AsyncioSelectorReactor"FEED_EXPORT_ENCODING="utf-8"#启用随机延迟间隔RANDOMIZE_DOWNLOAD_DELAY=True#构造多个user_agent供切换使用USER_AGENT_LIST=['Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/87.0.4280.88Safari/537.36','Mozilla/5.0(Macintosh;IntelMacOSX10_15_7)AppleWebKit/605.1.15(KHTML,likeGecko)Version/14.0.3Safari/605.1.15']#启用请求重试机制RETRY_ENABLED=True#请求重试最多3次RETRY_TIMES=3#下载超时时间(秒)DOWNLOAD_TIMEOUT=15#定义scrapy-redis设置SCHEDULER="scrapy_redis.scheduler.Scheduler"DUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPDupeFilter"#启用redis访问队列排队功能SCHEDULER_PERSIST=True#定义链接Redis时的host和接口(可选配置)REDIS_HOST='localhost'REDIS_PORT=6379#设置Redis管道REDIS_ITEMS_KEY='doubanproject:items'#配置数据库服务器地址MYSQL_HOST='localhost'#配置数据库名MYSQL_DATABASE='doubandb'MYSQL_USER='root'MYSQL_PASSWORD='Sziit123'#配置管道,注意管道名称ITEM_PIPELINES={"doubanproject.pipelines.DoubanprojectPipeline":300,}7、编写爬虫spiderimportscrapyfromdoubanproject.itemsimportBookItemfromscrapy_redis.spidersimportRedisSpiderclassDoubanbookSpider(RedisSpider):name="doubanbook"#通过redis_key输入爬虫的URL,需要在redis-cli设置douban_books:start_urlsredis_key='douban_books:start_urls'#初始化爬虫数据结构

item=BookItem()defparse(self,response):#选择目标网页的本书列表链接

books=response.xpath('//li[@class="subject-item"]')forbookinbooks:#提取书籍的详细信息

self.item['book_name']=book.xpath('.//h2/a/@title').get()self.item['book_img_url']=book.xpath('.//div[@class="pic"]/a/img/@src').get()self.item['book_son_url']=book.xpath('.//h2/a/@href').get()book_info=book.xpath('.//div[@class="pub"]/text()').get().strip().split('/')self.item['book_publisher']=book_info[-3].strip()iflen(book_info)>2elseNoneself.item['book_publish_time']=book_info[-2].strip()iflen(book_info)>1elseNoneself.item['book_author']=book_info[0].strip()iflen(book_info)>0elseNoneself.item['book_grade']=book.xpath('.//span[@class="pl"]/text()').get()self.item['book_description']=book.xpath('.//p/text()').get()#进入每个书的详情页并解析额外的信息#进入每个书的详情页并解析额外的信息ifself.item['book_son_url']: #打开书籍的链接获取详细信息,需要把item实例传给回调函数

yieldscrapy.Request(url=self.item['book_son_url'],dont_filter=True,callback=self.parse_details,meta={'item':self.item})#翻页,爬取下一页的书籍信息

next_page=response.css('div.paginatorspan.nexta::attr(href)').get()ifnext_page:next_page_url=response.urljoin("/"+next_page)yieldscrapy.Request(next_page_url,callback=self.parse)defparse_details(self,response):#提取书籍详情页的额外信息

self.item=response.meta['item']book_score=response.xpath('//*[@id="interest_sectl"]/div/div[2]/strong/text()').get()#提取作者简介和书籍简介

book_author_introduction=response.xpath('//*[@id="content"]/div/div[1]/div[3]/div[2]/div/div/p/text()').getall()ifresponseisnotNoneelseNonebook_introduction=response.xpath('//*[@id="content"]/div/div[1]/div[3]/div[3]/div/div/p/text()').getall()ifresponseisnotNoneelseNone#提取标签

book_labels=response.xpath('//div[@id="db-tags-section"]/div/span/a/text()').getall()#将爬取的字段赋给item实例对象

self.item['book_score']=''.join(book_score)self.item['book_labels']=''.join(book_labels[0]iflen(b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论