哈工大信息内容安全实验二--网页爬虫

一、实验内容

爬取豆瓣电影top250 movie.douban.com的前10部电影的信息,以及每部电影的前五热评保存在文件中。

二、Scrapy框架介绍:

Scrapy是Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。

Scrapy框架主要由五大组件组成,它们分别是调度器(Scheduler)、下载器(Downloader)、爬虫(Spider)和实体管道(Item Pipeline)、Scrapy引擎(Scrapy Engine)。

 (1)、调度器(Scheduler):

调度器,说白了把它假设成为一个URL(抓取网页的网址或者说是链接)的优先队列,由它来决定下一个要抓取的网址是 什么,同时去除重复的网址(不做无用功)。用户可以自己的需求定制调度器。

(2)、下载器(Downloader):

下载器,是所有组件中负担最大的,它用于高速地下载网络上的资源。Scrapy的下载器代码不会太复杂,但效率高,主要的原因是Scrapy下载器是建立在twisted这个高效的异步模型上的(其实整个框架都在建立在这个模型上的)。

(3)、 爬虫(Spider):

爬虫,是用户最关心的部份。用户定制自己的爬虫(通过定制正则表达式等语法),用于从特定的网页中提取自己需要的信息,即所谓的实体(Item)。 用户也可以从中提取出链接,让Scrapy继续抓取下一个页面。

(4)、 实体管道(Item Pipeline):

实体管道,用于处理爬虫(spider)提取的实体。主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。

(5)、Scrapy引擎(Scrapy Engine):

Scrapy引擎是整个框架的核心.它用来控制调试器、下载器、爬虫。实际上,引擎相当于计算机的CPU,它控制着整个流程。

三、 实验步骤:

1.环境配置创建项目

1)安装scrapy框架(在cmd中)

pip install scrapy

2)创建一个新的Scrapy项目

        scrapy startproject AAA    AAA是你的项目名

scrapy startproject douban

3)创建Scrapy爬虫

        进入AAA文件夹  scrapy genspider BBB CCC.com

         BBB是你的爬虫名 CCC.com是你的目标域名

cd douban  //进入你希望创建的爬虫目录
scrapy genspider douban_spider movie.douban.com

        创建的目录如下

4)创建后spiders下会自动生成BBB.py,在这里进行规则编写

5)在settings.py中进行规则编写

注:善用Ctrl+F查找

#设置用户代理避免被识别为脚本

USER_AGENT = 'Mozilla/4.0'

#默认遵守robots.txt,改掉

ROBOTSTXT_OBEY = False

#最大并发(默认16)

CONCURRENT_REQUESTS = 64

#禁用cookies(默认启用)

COOKIES_ENABLED = False

#开启管道(开启才能用piplines.py)

ITEM_PIPELINES = {

    在这里设置编写的管道的优先级高低,越小优先级越高,默认会生成一个爬虫的,如果要编写入库等动作,可以设置这些动作之间的优先级顺序

}

#配置输出,设置输出为JSON格式

FEED_FORMAT = 'json'
FEED_URI = 'douban_top10_movies.json'

 2.爬虫编写

douban/spiders 目录下 douban_spider.py 的文件中,添加以下代码:

#导入Scrapy框架,这是一个用于创建和管理Web爬虫的Python库
import scrapy
#导入名为"DoubanItem"的项目类,用于定义爬取到的数据的结构。
from douban.items import DoubanItem

#定义一个名为"DoubanSpider"的Spider类,继承自Scrapy的Spider类
class DoubanSpider(scrapy.Spider):
   # 设置Spider的名称为'douban_spider',这个名称可以在运行爬虫时用来识别和调用爬虫。
   name = 'douban_spider'
   # 指定Spider的起始URL
   start_urls = ['https://movie.douban.com/top250']


#定义了用于处理起始URL响应的parse方法,它接收一个response参数,包含了来自起始URL的页面内容。
   def parse(self, response):
       # 获取电影列表
       movies = response.xpath('//ol[@class="grid_view"]/li')

       # 仅获取前10部电影
       for movie in movies[:10]:
           item = DoubanItem()
           item['title'] = movie.xpath('.//div[@class="hd"]/a/span[1]/text()').extract_first().strip()
           item['rating'] = movie.xpath(
               './/div[@class="bd"]/div[@class="star"]/span[2]/text()').extract_first().strip()
           item['link'] = movie.xpath('.//div[@class="hd"]/a/@href').extract_first()


          #发送一个新的请求,爬取电影的评论页面,并将之前创建的DoubanItem对象通过meta参数传递给parse_comments方法
           yield scrapy.Request(item['link'], callback=self.parse_comments, meta={'item': item})

   #定义了用于处理评论页面响应的parse_comments方法,它接收包含电影评论页面内容的response
   def parse_comments(self, response):
       #从之前请求中传递的meta中获取item,这个item包含了电影的基本信息
       item = response.meta['item']
       comments = response.xpath('//div[@class="comment"]/p/span[@class="short"]')

       # 获取前五热评
       #通过yield返回包含电影信息和评论的item对象,将它们传递给Scrapy管道进行后续处理
       item['comments'] = [comment.extract() for comment in comments[:5]]

       yield item

定义Items:

douban/items.py 文件中定义你想要爬取的数据:

import scrapy
#"DoubanItem"是一个Scrapy的数据项(Item),用于存储网页上抓取的数据
class DoubanItem(scrapy.Item):
    title = scrapy.Field()   #标题
    rating = scrapy.Field()  #评分
    link = scrapy.Field()    #链接
    comments = scrapy.Field() #评论

运行爬虫:

在PyCharm的终端运行以下命令:

scrapy crawl douban_spider

运行完成后,你将在项目目录下看到一个名为 douban_top10_movies.json 的文件,其中包含了豆瓣电影 Top 250 的前 10 部电影的标题、评分、链接和前五热评。

代码流程

1. 开始
2. 启动名为 'douban_spider' 的 Scrapy 爬虫
3. 跳转到起始URL:https://movie.douban.com/top250
4. 解析起始页面的响应(parse 方法)
5. 从响应中提取电影列表(movies)
6. 遍历前10部电影(movies[:10])
   7. 创建一个 DoubanItem 对象(item)
   8. 从电影元素中提取电影标题(title),评分(rating),和链接(link)
   9. 发送一个新的请求到电影详情页面(item['link']),并指定回调函数为 parse_comments
      10. 将 item 对象作为元数据(meta)附加到请求
11. 进入 parse_comments 方法,处理电影详情页面的响应
   12. 从元数据中提取之前创建的 item 对象
   13. 从响应中提取电影评论(comments)
   14. 获取前五条热门评论
   15. 将评论存储在 item 对象的 comments 字段中
   16. 返回 item 对象,将其传递到 Scrapy 管道进行处理
17. 重复步骤 6-11,直到遍历完前10部电影
18. 结束

注意事项:

1.如果在PyCharm中 import scrapy 报错,在终端中再次运行

pip install scrapy

2. xpath的路径是根据所选择的网页源码确定的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值