Scrapy-CrawlSpider-MySQL-猎云网

CrawlSpider爬虫:

  1. 作用:可以定义规则,让Scrapy自动的去爬取我们想要的链接。而不必跟Spider类一样,手动的yield Request。
  2. 创建:scrapy genspider -t crawl [爬虫名] [域名]
  3. 提取的两个类:
    • LinkExtrator:用来定义需要爬取的url规则。
    • Rule:用来定义这个url爬取后的处理方式,比如是否需要跟进,是否需要执行回调函数等。

关于scrapy框架的搭建问题,有个小小的建议,可以先将这四个库先安装好

lxml,pyopenssl,twisted,pywin32 

然后直接下载就好

pip install scrapy

ok,环境问题我们就已经解决了,接下来我们可以愉快的学习了。

1.创建好相应的文档,文件

我们先创建一个文件夹取名为 “my猎云网”,然后打开cmd跳转至当前路径输入cmd命令,创建一下项目:

scrapy startproject lyw

然后根据提示输入:

cd lyw

ok,接下来我们要创建一个CrawlSpider爬虫,出入cmd命令:

scrapy genspider -t crawl lyw_spider lieyunwang.org

在这里插入图片描述
好的这样的话我们就创建了一个CrawlSpider爬虫,接下来将我们的项目通过pycharm打开。
我们先看一下这些文件都是什么

在这里插入图片描述## 项目文件作用:

  1. settings.py:用来配置爬虫的。
  2. middlewares.py:用来定义中间件。
  3. items.py:用来提前定义好需要下载的数据字段。
  4. pipelines.py:用来保存数据。
  5. scrapy.cfg:用来配置项目的。
  6. lyw_spider.py:我们的爬虫文件。

2.对搭好的框架进行一个简单修改

2.1 start.py
首先呢,我们先改进一下我们的启动方式
开启scapy进行爬虫,需要在cmd中输入命令:

scrapy crawl lyw_spider

我们做一些优化,在项目下新建一个start.py
输入代码:

from scrapy import cmdline

cmdline.execute('scrapy crawl lyw_spider'.split(' '))

这样我们就可以直接通过pychar来进行我们的操作了

2.2 settings.py
对ssttings文件的修改

#修改协议为不遵守
ROBOTSTXT_OBEY = False
#添加游览器的信息
DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'en',
  'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
#开启管道
ITEM_PIPELINES = {
   'lyw.pipelines.LywPipeline': 300,
}

3.分析需求

3.1
需求:实现猎云网网站的文章数据爬虫。需要保存标题、作者、发布时间、内容、原始url字段,然后异步保存到mysql数据库中。

ok,我们需要对这个网站上面的一些文章做处理,然后进行保存,异步保存,保存到mysql

3.2 item.py
在item文件中添加我们需要的字段

class LywItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    pub_time = scrapy.Field()
    author = scrapy.Field()
    content = scrapy.Field()
    origin = scrapy.Field()

然后在爬虫文件中引用:

from ..items import LywItem

4.爬虫文件

对爬虫文件lyw_spider.py进行代码添加

class LywSpiderSpider(CrawlSpider):
    name = 'lyw_spider'
    allowed_domains = ['lieyunwang.com']
    #此处需要填写网站的起始url
    start_urls = ['https://www.lieyunwang.com/latest/p1.html']
	
	#规则
    rules = (
    	#规则1:利用正则表达式获取所有的下一页url,跟进(在下一页中进行查找)
        Rule(LinkExtractor(allow=r'/latest/p\d+\.html'), follow=True),
        #规则2:利用正则表达式获取每个文章的详细页,在当前页面调用回调函数‘parse_item’,不跟进(不继续深挖)
        Rule(LinkExtractor(allow=r'/archives/\d+'), callback='parse_item', follow=False),  #规则,会掉函数,是否跟进
    )

    def parse_item(self, response):
    	#获取文章的发布时间
        pub_time = response.xpath('//h1[@class = "lyw-article-title"]/span/text()').get()
        #获取文章的标题
        title_list = response.xpath('//h1[@class = "lyw-article-title"]/text()').getall()
        title = ''.join(title_list).strip()
        #获取文章的作者信息
        author = response.xpath('//div[@class = "author-info"]/a/text()').get()
        #获取文章的内容
        content = response.xpath('//div[@class = "main-text"]').get()
        #获取文章的原始url字段
        origin = response.url
        #将获取到的信息传递给管道
        item = LywItem(title=title,pub_time=pub_time,author=author,content=content,origin=origin)
        yield item

5.异步保存至mysql

1.settings.py
在settings.py文件中添加我们的数据库信息

MYSQL_CONFIG = {
    'DRIVER' : 'pymysql',    #解释器为pymysql
    'HOST' : 'localhost',    #主机:本地
    'PORT' : 3306,           #端口:3306
    'USER' : 'root',		 #用户名
    'PASSWORD' : 'root',	 #用户密码
    'DATABASE' : 'lieyunwang'    #数据库名
}

2.pipelines.py
在pipelines.py文件中对数据进行存储

  1. 使用twisted.enterprise.adbapi来创建连接池
  2. 使用runInteraction来运行插入sql语句的函数
  3. 在插入sql语句的函数中,第一个非self的参数就是cursor对象,使用这个对象执行sql语句

此时,我们已经有了数据item和数据库的连接方式
接下来我们要做的就是异步写入mysql

我们需要通过twisted来创建一个连接池
然后将连接池与mysql相连接
在通过连接池的runInteraction方法来插入我们的sql语句,

#我们的异步操作需要依靠twisted库来执行,首先我们先导入函数
from twisted.enterprise import adbapi


class LywPipeline(object):
    def __init__(self,mysql_config):
    	#创建连接池,并对连接参数进行设置
        self.dbpool = adbapi.ConnectionPool(
            mysql_config['DRIVER'],
            host=mysql_config['HOST'],
            port=mysql_config['PORT'],
            user=mysql_config['USER'],
            password=mysql_config['PASSWORD'],
            db=mysql_config['DATABASE'],
            charset='utf8'
        )

    @classmethod
    def from_crawler(cls,crawler):
        # 只要重写了from_crawler方法,那么以后创建对象的时候,就会调用这个方法来创建 pipelines
        mysql_config = crawler.settings['MYSQL_CONFIG']
        return cls(mysql_config)

	#数据保存运行函数
    def process_item(self, item, spider):
    	#运行run方法来输出我们的sql语句
        result = self.dbpool.runInteraction(self.insert_item,item)
        result.addErrback(self.insert_error())
        return item
		
	#sql语句插入函数
    def insert_item(self,cursor,item):
        sql = 'insert into article(id,title,author,pub_time,content,origin) values(null,%s,%s,%s,%s,%s)'
        args = (item['title'],item['author'],item['pub_time'],item['content'],item['origin'])
        cursor.execute(sql,args)
	
	#错误打印机制
    def insert_error(self,failure):
        print('-'*50)
        print(failure)
        print('-'*50)
	
	#关闭爬虫
    def close_spider(self,spider):
        self.dbpool.close()

我们的成果:

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
【为什么学爬虫?】        1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!        2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站 【课程设计】 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是:网络请求:模拟浏览器的行为从网上抓取数据。数据解析:将请求下来的数据进行过滤,提取我们想要的数据。数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是:爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。Scrapy和分布式爬虫Scrapy框架Scrapy-redis组件、分布式爬虫等。通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求!【课程服务】 专属付费社群+定期答疑
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值