33-Scrapy框架-豆瓣电影top250-【存储到mongodb/代理验证】

本文介绍了一个使用Scrapy框架爬取豆瓣电影Top250榜单的详细过程,包括从创建项目、定义数据项、编写爬虫逻辑到数据存储至MongoDB的完整步骤,并实现了User-Agent和代理的随机切换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目的:爬取豆瓣电影(https://movie.douban.com/top250),并将信息(电影标题、信息、评分、简介)保存到本地数据库

分析1:    针对每页(比如首页:https://movie.douban.com/top250?start=0)【start以25的间隔增加】

  • 电影标题 response.xpath('//div[@class="info"]//span[@class="title"][1]/text()').extract()
  • 电影信息 response.xpath('//div[@class="info"]/div[@class="bd"]/p/text()').extract()
  • 评分        response.xpath('//div[@class="info"]//span[@class="rating_num"]/text()').extract()
  • 简介        response.xpath('//div[@class="info"]//p[@class="quote"]/span/text()').extract()

分析2:    采用基于spider类的Scrapy框架

  • 难点1:    在pipelines.py管道文件中,将爬取的数据保存到mongodb
  • 难点2:    在middlewares.py中间件中,设置User-Agent和Proxy

1、cmd中的操作

C:\Users\Administrator\Desktop>scrapy startproject douban
C:\Users\Administrator\Desktop>cd douban
C:\Users\Administrator\Desktop\douban>scrapy genspider demo movie.douban.com

2、编辑items.py,设置需要保存的数据

from scrapy import Field,Item
class DoubanItem(Item):
    title=Field()  #标题
    bd=Field()  #信息
    star=Field()  #评分
    quote=Field()  #简介

3、在demo.py中编辑爬虫文件

import scrapy
from douban.items import DoubanItem

class DemoSpider(scrapy.Spider):
    name = 'demo'
    allowed_domains = ['movie.douban.com']
    url='https://movie.douban.com/top250?start='
    start=0
    start_urls = [url+str(start)]   #自己拼接访问的url

    def parse(self, response):
        divs=response.xpath('//div[@class="info"]')
        for div in divs:
            item=DoubanItem()
            item['title']=div.xpath('.//span[@class="title"][1]/text()').extract()[0]
            item['bd']=div.xpath('./div[@class="bd"]/p/text()').extract()[0]
            item['star']=div.xpath('.//span[@class="rating_num"]/text()').extract()[0]
            item['quote']=div.xpath('.//p[@class="quote"]/span/text()').extract()[0]
            yield item

        if self.start<=225:
            self.start+=25
        yield scrapy.Request(url=self.url+str(self.start),callback=self.parse)  #访问新的一页

插入分析难点,所以需要先设置settings.py配置文件,然后再编辑pipelines.py和middlewares.py文件

  • 难点1:    在pipelines.py管道文件中,将爬取的数据保存到mongodb
  • 难点2:    在middlewares.py中间件中,设置User-Agent和Proxy

4、编辑settings.py配置文件   【只列出修改部分】

#打开middlewares中间件
DOWNLOADER_MIDDLEWARES = {
    #'douban.middlewares.DoubanDownloaderMiddleware': 543,
    'douban.middlewares.RandomUserAgentMiddleware':100,  #随机User-Agent
    'douban.middlewares.RandomProxyMiddleware':200,  #随机代理
}
#随机的User-agent
USER_AGENT=[
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;",
    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
    "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4094.1 Safari/537.36",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
    "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)",
]
#代理
PROXIES=[
    {'ip_port':'121.42.140.113:16816','user_passwd':'psy:123456789'},   #私密的IP代理,需要用户名和密码,需要验证
    {'ip_port':'182.46.115.77:8118','user_passwd':'123456789'},   #免费的IP代理,不需要用户名和密码,不需要验证
         ]
#打开pipelines管道文件
ITEM_PIPELINES = {
    'douban.pipelines.DoubanPipeline': 300,  #将数据保存到MongoDB数据库
}
MONGODB_HOST='127.0.0.1'  #mongodb主机名
MONGODB_PORT=27017  #mongodb端口号
MONGODB_DBNAME='Douban'  #数据库名称
MONGODB_SHEETNAME='movies'  #表名称    【MongoDB数据库的设置】

5、编辑pipelines.py文件  将爬取的item数据保存到MongoDB数据库中

此时需要先在cmd中操作:C:\Users\Administrator>mongod --dbpath D:\data\db --port 27017

目的:打开mongodb在27017端口的数据库

一定要执行该步骤,否则数据不能保存到mongodb数据库中,也不能使用MongoDB Compass桌面控制软件

import pymongo
from scrapy.conf import settings  #导入settings.py中的配置文件
#或者使用 from douban.settings import *

class DoubanPipeline(object):
    def __init__(self):
        self.host=settings['MONGODB_HOST']  #mongodb主机名
        self.port=settings['MONGODB_PORT']  #mongodb端口号
        self.dbname=settings['MINGODB_DBNAME']  #数据库名称
        self.sheetname=settings['MONGODB_SHEETNAME']  #表名称
        client=pymongo.MongoClient(host=self.host,port=self.port)  #创建mongodb数据库连接
        mydb=client[self.dbname]  #指定数据库
        self.post=mydb[self.sheetname]  #存放数据的数据库表名

    def process_item(self,item,spider):
        data=dict(item)
        self.post.insert(data)  #将数据存入到mongodb数据库中
        return item

6、编辑middlewares.py文件,分别随机添加User-Agent和ip代理

import random,base64
from douban.settings import USER_AGENT,PROXIES
from scrapy import signals

class RandomUserAgentMiddleware(object):  #随机的User-Agent
    def process_item(self,request,spider):
        useragent=random.choice(USER_AGENT)
        request.headers.setdefault('User-Agent',useragent)

class RandomProxyMiddleware(object):  #随机的代理
    def process_request(self,request,spider):
        proxy=random.choice(PROXIES)
        if proxy['user_passwd'] is None:  #没有代理账号验证的代理使用方式
            request.meta['proxy']="http://"+proxy['ip_port']
        else:  #使用代理账户验证的代理使用方式
            request.meta['proxy']="http://"+proxy['ip_port']
            base64_userpasswd=base64.b64encode(proxy['user_passed'])  #对账户密码进行base64编码转换
            request.headers['Proxy-Authorization']=base64_userpasswd  #对应到代理服务器的信令格式  (代理用户验证)

7、运行

C:\Users\Administrator\Desktop\douban>scrapy crawl demo

此时MongoDB中的‘Douban’数据库中的‘movies’表中出现,且存放爬取的相应信息。

转载于:https://my.oschina.net/pansy0425/blog/3092736

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值