• Scrapy学习篇(三)之创建项目和Scrapy的安装


    安装Scrapy

    了解了Scrapy的框架和部分命令行之后,创建项目,开始使用之前,当然是安装Scrapy框架了。

    关于Scrapy框架的安装,请参考:https://cuiqingcai.com/5421.html

    创建项目

    创建项目是爬取内容的第一步,之前已经讲过,Scrapy通过scrapy startproject <project_name>命令来在当前目录下创建一个新的项目。
    下面我们创建一个爬取网址(http://quotes.toscrape.com/)的名言,作者和tags为例讲解。

    scrapy startproject quotes      #项目名称

    scrapy genspider quotes quotes.com   # quotes为爬虫名称,quotes.com为允许爬取的域名限制

    其中quotes是你的项目的名字,可以自己定义。
    其目录结构如下

    
    

    下面简单的讲解一下各目录/文件的作用:

    • scrapy.cfg
      项目的配置文件,带有这个文件的那个目录作为scrapy项目的根目录
    • items.py
      定义你所要抓取的字段
    • pipelines.py
      管道文件,当spider抓取到内容(item)以后,会被送到这里,这些信息(item)在这里会被清洗,去重,保存到文件或者数据库
    • middlewares.py
      中间件,主要是对功能的拓展,你可以添加一些自定义的功能,比如添加随机user-agent, 添加proxy,cookies;当需要使用selenium时,也是在这里设置。
    • settings.py
      设置文件,用来设置爬虫的默认信息,相关功能开启与否,比如是否遵循robots协议,设置默认的headers,设置文件的路径,中间件的执行顺序等等。
    • spiders/
      在这个文件夹下面,编写你自定义的spider。

    编写爬虫

    编写spider文件

    在项目中的spiders文件夹下面创建一个文件,命名为quotes.py我们将在这个文件里面编写我们的爬虫。先上代码再解释。

    class QuotesSpider(scrapy.Spider):
    
        name = 'quotes'
        allowed_domains = ['quotes.toscrape.com']
        start_urls = ['http://quotes.toscrape.com/']
    
        def parse(self, response):
            quotes = BeautifulSoup(response.text,'lxml')
            for quote in quotes.find_all(name = 'div',class_='quote'):
                item = QuoteItem() #使用items中定义的数据结构
                for s in quote.find_all(name = 'span',class_='text'):
                    item['text'] = s.text
                for s in quote.find_all(name= 'small',class_='author'):
                    item['author'] = s.text
                for s in quote.find_all(name='div', class_='tags'):
                    item['tags'] = s.text.replace('
    ','').strip().replace(' ','')
                yield item
    
            nexts = quotes.find_all(name='li', class_='next')   #获取下一页的地址
            for next in nexts:
                n = next.find(name='a')
                url = 'http://quotes.toscrape.com/' + n['href']
                yield scrapy.Request(url = url,callback = self.parse)
    • 导入scrapy模块
    • 定义一个spider类,继承自scrapy.Spider父类。

    下面是三个重要的内容

    • name: 用于区别Spider。 该名字必须是唯一的,不可以为不同的Spider设定相同的名字。这一点很重要。
    • start_urls: 包含了Spider在启动时进行爬取的url列表。第一个被获取到的页面将是其中之一。即这是爬虫链接的起点,爬虫项目启动,便开始从这个链接爬取,后续的URL则从初始的URL获取到的数据中提取。
    • parse() 是spider的一个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象

    修改settings.py文件

    将settings.py文件里面的下列内容修改如下,其余的内容不动。

    ROBOTSTXT_OBEY = False   #不遵循robots协议
    
    #去掉下面的这个注释,以设置请求头信息,伪造浏览器headers,并手动添加一个user-agent,也可以在下载器中间件中设置更灵活的user-agent获取方法
    DEFAULT_REQUEST_HEADERS = {
      'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
      'Accept-Language': 'en',
      #user-agent新添加
      'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
    }

    编写Pipeline

    我们将在pipeline文件中处理在spider中获取到的item,将其存储到mongodb数据库中。

    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() 

    运行我们的爬虫项目

    至此,项目必要的信息已经全部完成了,下面就是运行我们的爬虫项目
    进入带有scrapy.cfg文件的那个目录,前面已经说过,这是项目的根目录,执行下面的命令
    scrapy crawl quotes
    查看mongodb数据库,数据应该已经获取下来了。

  • 相关阅读:
    Mysql热备份
    win10 上安装虚拟机
    SpringMVC AJAX向后台传递数组参数/实体集合
    解决eclipse中tomcat不加载web项目的问题
    Python 基础第九天
    Python 基础第8天(文件管理)
    Python 基础第七天
    Python 基础第六天
    Python 基础第五天
    Python 基础第四天
  • 原文地址:https://www.cnblogs.com/lxbmaomao/p/10345747.html
Copyright © 2020-2023  润新知