Scrapy设置随机请求头爬取猫眼电影TOP100并用xpath解析数据后存入MongoDB

Scrapy设置随机请求头爬取猫眼电影TOP100并用xpath解析数据后存入MongoDB。

**1、**首先我们先创建一个scrapy项目,运行CMD后按下图所示进行创建:
在这里插入图片描述
**2、**项目创建好后,用pycharm打开项目maoyanToptutorial。在爬虫过程中,我们常会使用各种伪装来降低被目标网站反爬的概率,其中随机更换User-Agent就是一种手段。当我们的scrapy项目创建完成并执行时,首先会读取setting.py文件的配置,而在框架机制里又存在一个下载中间件,在setting.py里是默认关闭的,所以要先开启它(即去掉注释)。
setting.py

#随机跳变User-agent
DOWNLOADER_MIDDLEWARES = {
   'maoyanToptutorial.middlewares.MaoyantoptutorialDownloaderMiddleware': 543,
}

注释去除后来到middlewares.py文件填补相关程序,在改文件下有一个类MaoyantoptutorialDownloaderMiddleware,在该类下定义一个方法,此方法主要是创建一个UA列表即:

    def __init__(self):
        #UA列表
        self.USER_AGENT_LIST = [
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
            "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
            "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
            "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1",
            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
            "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
            "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
            "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
            "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
            "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
            "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
            "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
            "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
            "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
            "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
        ]

同样的在MaoyantoptutorialDownloaderMiddleware类下有一个process_request方法,主要是为了实现从UA列表中随机返回一个UA,我们将它改写为:

    def process_request(self, request, spider):
        request.headers['User-Agent']=random.choice(self.USER_AGENT_LIST)

至此,我们就实现了在scrapy中设置随机User-Agent,接下来我们将分析目标站点的URL请求规律后实现用xpath提取数据并存入MongoDB.。

**3、**打开chrome的开发者工具,切换到Network后刷新页面,观察到服务器返回给我们的东西里只有第一个请求URL:https://maoyan.com/board/4里有我们所需要的数据,切换到Response可以找到所需要的数据,如下图所示:
在这里插入图片描述
接着我们点击下一页获取更多的信息,并找到对相应的URL为:https://maoyan.com/board/4?offset=10 ,对URL进行比对分析后我们可以发现其中变化的字段为offset后的数字,且每次以10个偏移度增加,由此我们可以得到一个简化的URL为:https://maoyan.com/board/4?offset={“偏移度增加10”} ,接下来我们开始写爬虫程序。

**4、**由Response中的信息可知,我们所提取的数据在某些节点中,为了能够更好的解析页面信息,此处我们使用XPath解析库来提取节点,然后再调用相应方法获取它的正文内容或者属性值,此外我们还借助chrome浏览器的XPath Helper插件来辅助检查我们所写的匹配规则是否正确。比如以提取电影名为例,如下图所示:
在这里插入图片描述
**5、**知道提取规则后 ,我们开始写相应代码,首先来到items.py下定义item对象,即:

import scrapy
class MaoyantoptutorialItem(scrapy.Item):
    title = scrapy.Field()#电影名称
    star = scrapy.Field()#演员
    releasetime = scrapy.Field()#上映时间
	score=scrapy.Field()#评分

为了将数据存入MongoDB,我们还需在pipelines.py下添加以下代码:
pipelines.py

import pymongo
class MongoPipeline(object):
    def __init__(self,mongo_url,mongo_db):
        self.mongo_url=mongo_url
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls,crawler):
        return cls(
            mongo_url=crawler.settings.get('MONGO_URL'),
            mongo_db = crawler.settings.get('MONGO_DB')
        )

    def open_spider(self,spider):
        self.client=pymongo.MongoClient(self.mongo_url)
        self.db=self.client[self.mongo_db]

    def process_item(self,item,spider):
        name=item.__class__.__name__
        self.db[name].insert(dict(item))
        return item

    def close_spider(self,spider):
        self.client.close()

接着在setting.py文件的配置数据库的连接参数,即添加以下代码:
setting.py

MONGO_URL='localhost'
MONGO_DB='MAOYANTOP'
#启用MongoPipeline
ITEM_PIPELINES = {
   'maoyanToptutorial.pipelines.MongoPipeline': 300,
}

**6、**以上内容设置好后,来到spiders文件下的maoyanTop.py实现主要的爬取逻辑,代码如下:
maoyanTop.py

# -*- coding: utf-8 -*-
import scrapy
from maoyanToptutorial.items import MaoyantoptutorialItem

class MaoyantopSpider(scrapy.Spider):
    name = 'maoyanTop'
    allowed_domains = ['maoyan.com/board/4/?offset=']
    start_urls = ['https://maoyan.com/board/4/?offset=']
    # 下一页前缀url
    next_base_url = 'http://maoyan.com/board/4'
    
    def parse(self, response):
        if response:
            movies=response.xpath('//div[@class="main"]/dl/dd')# 获取每页所有电影的节点
            item = MaoyantoptutorialItem()
            for movie in movies:
                title=movie.xpath('.//a[@class="image-link"]/@title').extract_first()
                star=movie.xpath('.//div[@class="movie-item-info"]/p[@class="star"]/text()').extract_first()
                releasetime=movie.xpath('.//div[@class="movie-item-info"]/p[@class="releasetime"]/text()').extract_first()
                score_1=movie.xpath('.//div[contains(@class,"movie-item-number")]/p[@class="score"]/i[@class="integer"]/text()').extract_first()
                score_2=movie.xpath('.//div[contains(@class,"movie-item-number")]/p[@class="score"]/i[@class="fraction"]/text()').extract_first()

                item['title']=title
                item['star'] = star.strip()[3:]
                item['releasetime'] = releasetime.strip()[5:]
                item['score'] = score_1+score_2
                yield item
            # 处理下一页
            next=response.xpath('.').re_first(r'href="(.*?)">下一页</a>')
            if next:
                next_url = self.next_base_url + next
                # scrapy会对request的URL去重,加上dont_filter=True则告诉它这个URL不参与去重
                yield  scrapy.Request(url=next_url,callback=self.parse, dont_filter=True)

**6、**爬取结果如下图:
在这里插入图片描述

### 回答1: 好的,下面是用中文回复: scrapy是一个Python的爬虫框架,可以用来爬取各种网站的数据。要爬取猫眼电影top100,可以先找到猫眼电影的网址,然后用scrapy的爬虫程序来获取网页的HTML代码,再从HTML代码中提取出需要的数据,比如电影的名称、评分、演员等等。最后将这些数据保存到本地文件或者数据库中。 ### 回答2: Scrapy是一个Python中的爬虫框架,能够帮助我们轻松地抓取互联网上数据并进行存储和分析。本文将介绍如何使用Scrapy爬取猫眼电影top100。 爬虫流程 1. 创建Scrapy项目 运行命令 scrapy startproject maoyan 2. 创建爬虫 运行命令 scrapy genspider maoyan_spider maoyan.com 3. 设置爬虫 打开 maoyan_spider.py,编辑 start_urls,修改如下 start_urls = ['https://maoyan.com/board/4'] 可见该网址是猫眼电影top100的首页,该网址最多显示10个电影项,如图所示: ![maoyan_top10](https://s3.ax1x.com/2021/01/31/y7Uju9.png) 需要在该页面下爬取电影详细信息,并翻页抓取完所有top100电影信息。在网页底部,我们可以看到“下一页”的按钮和网址,格式为 https://maoyan.com/board/4?offset=10 当offset值为10、20等时,可以显示top100中接下来的10个电影信息。 那么我们可以把该网址放在 start_urls 里,并在parse函数中解析页面,获取电影信息。同时在函数中构造下一页的url,并将其送到爬虫引擎的调度器中继续处理。 4. 爬取电影信息 在maoyan_spider.py中,我们可以定义如下的 parse 函数: import scrapy from maoyan.items import MaoyanItem class MaoyanSpiderSpider(scrapy.Spider): name = 'maoyan_spider' allowed_domains = ['maoyan.com'] start_urls = ['https://maoyan.com/board/4'] def parse(self, response): movies = response.xpath('//div[@class="movie-item-info"]') for movie in movies: item = MaoyanItem() item['rank'] = movie.xpath('./div[@class="board-index"]/text()').extract_first().strip() item['title'] = movie.xpath('./div[@class="movie-item-info"]/p[@class="name"]/a/@title').extract_first().strip() item['star'] = movie.xpath('./div[@class="movie-item-info"]/p[@class="star"]/text()').extract_first().strip() item['time'] = movie.xpath('./div[@class="movie-item-info"]/p[@class="releasetime"]/text()').extract_first().strip() yield item 在parse函数中,我们使用XPath从response中解析出每个电影的名称、主演、上映时间和排名信息,并用yield语句将这些信息传回到Scrapy引擎中。同时,我们先在items.py中定义MaoyanItem,来存储电影信息: import scrapy class MaoyanItem(scrapy.Item): # 定义需要储存哪些电影信息 rank = scrapy.Field() title = scrapy.Field() star = scrapy.Field() time = scrapy.Field() 5. 翻页抓取 在parse函数中,我们需要再构建下一页的url,并将其传回到Scrapy引擎: def parse(self, response): movies = response.xpath('//div[@class="movie-item-info"]') for movie in movies: ... # 将下一页url交给引擎调度器 next_url = "https://maoyan.com/board/4?offset={0}".format(self.offset) if self.offset < 90: self.offset = self.offset + 10 yield scrapy.Request(next_url, callback=self.parse) 需要注意的是,这里的offset需要在MaoyanSpiderSpider类中进行初始化: def __init__(self): self.offset = 10 super(MaoyanSpiderSpider, self).__init__() 这样,Scrapy就会利用我们编写的parse函数,将top100电影的排名、名称、导演等信息全部抓取下来并存储在items中,最后我们可以使用pipelines.py将这些信息存储在数据库、文件中或者输出打印。 ### 回答3: Scrapy是一个用于爬取网站数据的Python框架。它可以大大简化网站爬取过程,让我们更高效、更方便地获取需要的数据。在这个教程中,我们将使用Scrapy框架来爬取猫眼电影top100数据。 Step1 创建Scrapy项目 首先,我们需要在命令行中创建一个新的Scrapy项目。打开命令行工具,输入以下命令(请确保已安装好Scrapy): scrapy startproject movie_top100 这将在当前目录中创建一个名为“movie_top100”的Scrapy项目文件夹。 Step2 创建Spider 在Scrapy项目中,爬虫是用来定义请求和如何处理爬取数据的。因此,我们需要创建一个新的爬虫代码文件。 在movie_top100项目文件夹下,打开命令行工具,输入以下命令($) scrapy genspider spider_name maoyan.com 这里的spider_name是我们新的爬虫命名,maoyan.com是我们要爬取数据的网站域名,这个命令会在我们的项目下创建一个名为 spider_name.py的文件。 Step3 编写Spider代码 在创建了spider_name.py文件后,我们可以开始编写我们的爬虫代码了。我们需要定义猫眼电影top100的URL链接,然后发送一个HTTP请求,通过解析返回的HTML页面来进行数据的提取和存储。 首先,在spider_name.py中我们需要导入必要的库: import scrapy from scrapy import Selector from movie_top100.items import MovieTop100Item scrapyScrapy框架的核心库,用于发送和处理HTTP请求、解析HTML网页等。 Selector是Scrapy框架内置的选择器库,用于选择和提取HTML页面中的元素。 MovieTop100Item是我们自己定义的数据结构类,用于存储爬取到的数据。 定义调度请求: 我们需要在我们定义的spider_name.py中定义请求链接。 class MaoyanSpider(scrapy.Spider): name = 'maoyan' allowed_domains = ['maoyan.com'] start_urls = ['https://maoyan.com/top/100'] 这里的name是我们定义爬虫的名字,allowed_domains是我们要爬取网站的域名,start_urls是我们要爬取的URL链接,我们通过分析猫眼电影top100列表发现数据在'https://maoyan.com/top/100'链接中,然同过这个链接我们将发送一个GET请求并返回一个HTML页面。接下来我们需要在该页面中寻找一些我们想要爬取数据。 定义数据解析: 我们需要解析HTML页面提取我们需要的数据我们首先需要根据HTML页面中的规律(XPath表达式)选取我们想要的数据。我们可以使用Selector库完美的完成这些任务。 我们需要在spider_name.py中添加一个parse()函数,代码如下: class MaoyanSpider(scrapy.Spider): name = 'maoyan' allowed_domains = ['maoyan.com'] start_urls = ['https://maoyan.com/top/100'] def parse(self, response): movies = Selector(response=response).xpath('//div[@class="movie-item-info"]') 通过使用XPath表达式’//div[@class="movie-item-info"]’,我们将提取出top100列表中所有电影的基本信息。我们得到的是一个列表类型的数据,需要循环遍历并单独进行提取。 for movie in movies: item = MovieTop100Item() MovieTop100Item就是我们之前定义好的数据存储结构。 item['name'] = movie.xpath('div[@class="movie-item-title"]/a/text()').extract_first() item['star'] = movie.xpath('div[@class="movie-item-hover"]/div[@class="movie-hover-info"]/div[1]/span[2]/text()').extract_first() item['time'] = movie.xpath('div[@class="movie-item-hover"]/div[@class="movie-hover-info"]/div[3]/text()').extract_first().strip() yield item 通过上述代码我们提取了每个电影的名称,明星和上映时间。最后使用yield item将数据存储结构类的对象item返回给 Scrapy 框架。最终的Spider代码为: import scrapy from scrapy import Selector from movie_top100.items import MovieTop100Item class MaoyanSpider(scrapy.Spider): name = 'maoyan' allowed_domains = ['maoyan.com'] start_urls = ['https://maoyan.com/top/100'] def parse(self, response): movies = Selector(response=response).xpath('//div[@class="movie-item-info"]') for movie in movies: item = MovieTop100Item() item['name'] = movie.xpath('div[@class="movie-item-title"]/a/text()').extract_first() item['star'] = movie.xpath('div[@class="movie-item-hover"]/div[@class="movie-hover-info"]/div[1]/span[2]/text()').extract_first() item['time'] = movie.xpath('div[@class="movie-item-hover"]/div[@class="movie-hover-info"]/div[3]/text()').extract_first().strip() yield item Step4 运行爬虫 代码完成后我们在命令行中运行我们的爬虫: scrapy crawl maoyan 我们将看到Scrapy框架开始爬取数据,并将数据存储到我们之前定义好的movie_top100/items.py的MovieTop100数据存储结构中。 Step5 数据文件存储 当Scrapy框架完成了数据爬取,我们将得到的数据存入文件中。我们需要再在pipeline.py中编写代码,将数据存储到目标文件中。 如下所示: class MovieTop100Pipeline(object): def __init__(self): self.file = open('maoyan_movie_top100.txt', 'w', encoding='utf-8') def process_item(self, item, spider): line = item['name'] + '\t' + item['star'] + '\t' + item['time'] + '\n' self.file.write(line) return item def close_spider(self, spider): self.file.close() 当我们完成了数据管道的编写后,将它加入到我们的movie_top100/settings.py文件中: ITEM_PIPELINES = { 'movie_top100.pipelines.MovieTop100Pipeline': 300, } 这里的“300”表示处理顺序,数字越小的管道将先经过处理。 运行我们的爬虫命令: scrapy crawl maoyan 当你运行完成后,会在movie_top100文件夹下生成一个 maoyan_movie_top100.txt文件。我们尝试打开和查看, 就可以看到我们编写的爬虫成功地抓取猫眼电影top100并且将这些数据成功的存储到了txt文件中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值