Browse Source

Initial commit

Allen 8 years ago
parent
commit
e2ee4db2cd

+ 0 - 0
.gitignore


+ 0 - 0
myFirstSpider/__init__.py


BIN
myFirstSpider/__pycache__/__init__.cpython-36.pyc


BIN
myFirstSpider/__pycache__/items.cpython-36.pyc


BIN
myFirstSpider/__pycache__/mysqlPipeline.cpython-36.pyc


BIN
myFirstSpider/__pycache__/settings.cpython-36.pyc


+ 17 - 0
myFirstSpider/items.py

@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+
+# Define here the models for your scraped items
+#
+# See documentation in:
+# https://doc.scrapy.org/en/latest/topics/items.html
+
+import scrapy
+
+
+class MyfirstspiderItem(scrapy.Item):
+    # define the fields for your item here like:
+    # name = scrapy.Field()
+    author = scrapy.Field()
+    content = scrapy.Field()
+    tag = scrapy.Field()
+    pass

+ 103 - 0
myFirstSpider/middlewares.py

@@ -0,0 +1,103 @@
+# -*- coding: utf-8 -*-
+
+# Define here the models for your spider middleware
+#
+# See documentation in:
+# https://doc.scrapy.org/en/latest/topics/spider-middleware.html
+
+from scrapy import signals
+
+
+class MyfirstspiderSpiderMiddleware(object):
+    # Not all methods need to be defined. If a method is not defined,
+    # scrapy acts as if the spider middleware does not modify the
+    # passed objects.
+
+    @classmethod
+    def from_crawler(cls, crawler):
+        # This method is used by Scrapy to create your spiders.
+        s = cls()
+        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
+        return s
+
+    def process_spider_input(self, response, spider):
+        # Called for each response that goes through the spider
+        # middleware and into the spider.
+
+        # Should return None or raise an exception.
+        return None
+
+    def process_spider_output(self, response, result, spider):
+        # Called with the results returned from the Spider, after
+        # it has processed the response.
+
+        # Must return an iterable of Request, dict or Item objects.
+        for i in result:
+            yield i
+
+    def process_spider_exception(self, response, exception, spider):
+        # Called when a spider or process_spider_input() method
+        # (from other spider middleware) raises an exception.
+
+        # Should return either None or an iterable of Response, dict
+        # or Item objects.
+        pass
+
+    def process_start_requests(self, start_requests, spider):
+        # Called with the start requests of the spider, and works
+        # similarly to the process_spider_output() method, except
+        # that it doesn’t have a response associated.
+
+        # Must return only requests (not items).
+        for r in start_requests:
+            yield r
+
+    def spider_opened(self, spider):
+        spider.logger.info('Spider opened: %s' % spider.name)
+
+
+class MyfirstspiderDownloaderMiddleware(object):
+    # Not all methods need to be defined. If a method is not defined,
+    # scrapy acts as if the downloader middleware does not modify the
+    # passed objects.
+
+    @classmethod
+    def from_crawler(cls, crawler):
+        # This method is used by Scrapy to create your spiders.
+        s = cls()
+        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
+        return s
+
+    def process_request(self, request, spider):
+        # Called for each request that goes through the downloader
+        # middleware.
+
+        # Must either:
+        # - return None: continue processing this request
+        # - or return a Response object
+        # - or return a Request object
+        # - or raise IgnoreRequest: process_exception() methods of
+        #   installed downloader middleware will be called
+        return None
+
+    def process_response(self, request, response, spider):
+        # Called with the response returned from the downloader.
+
+        # Must either;
+        # - return a Response object
+        # - return a Request object
+        # - or raise IgnoreRequest
+        return response
+
+    def process_exception(self, request, exception, spider):
+        # Called when a download handler or a process_request()
+        # (from other downloader middleware) raises an exception.
+
+        # Must either:
+        # - return None: continue processing this exception
+        # - return a Response object: stops process_exception() chain
+        # - return a Request object: stops process_exception() chain
+        pass
+
+    def spider_opened(self, spider):
+        spider.logger.info('Spider opened: %s' % spider.name)

+ 28 - 0
myFirstSpider/mysqlPipeline.py

@@ -0,0 +1,28 @@
+import pymysql.cursors #引入之前安装用于连接MYSQLDB的库
+import datetime
+
+
+class MySQLPipeline(object):
+    def __init__(self):
+        # 创建于数据库的连接
+        self.connect = pymysql.connect(
+            host='10.3.14.20',  # DB地址
+            port=14062,  # DB端口
+            db='scrapySpiderTest',  # DB名
+            user='root',  # DB用户名
+            passwd='usestudio-1',  # DB密码
+            charset='utf8',  # 编码方式
+            use_unicode=True)
+        # 通过cursor执行CRUD
+        self.cursor = self.connect.cursor()
+
+    def process_item(self, item, spider):
+        # 第一个参数是MYSQL语句
+        # 第二个参数分别是作者、内容、标签、当前时间
+        self.cursor.execute(
+            """INSERT INTO content(author, content, tag, lastUpdateTime) value (%s, %s, %s, %s)""",
+            (item['author'], item['content'], item['tag'], datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
+        )
+        # 执行sql语句
+        self.connect.commit()
+        return item  # 必须实现返回

+ 11 - 0
myFirstSpider/pipelines.py

@@ -0,0 +1,11 @@
+# -*- coding: utf-8 -*-
+
+# Define your item pipelines here
+#
+# Don't forget to add your pipeline to the ITEM_PIPELINES setting
+# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
+
+
+class MyfirstspiderPipeline(object):
+    def process_item(self, item, spider):
+        return item

+ 3 - 0
myFirstSpider/runner.py

@@ -0,0 +1,3 @@
+from scrapy.cmdline import execute
+execute(['scrapy', 'runspider',
+         'E:\workspace\myFirstSpider\myFirstSpider\spiders\\ngaSpider.py'])

+ 91 - 0
myFirstSpider/settings.py

@@ -0,0 +1,91 @@
+# -*- coding: utf-8 -*-
+
+# Scrapy settings for myFirstSpider project
+#
+# For simplicity, this file contains only settings considered important or
+# commonly used. You can find more settings consulting the documentation:
+#
+#     https://doc.scrapy.org/en/latest/topics/settings.html
+#     https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
+#     https://doc.scrapy.org/en/latest/topics/spider-middleware.html
+
+BOT_NAME = 'myFirstSpider'
+
+SPIDER_MODULES = ['myFirstSpider.spiders']
+NEWSPIDER_MODULE = 'myFirstSpider.spiders'
+
+
+# Crawl responsibly by identifying yourself (and your website) on the user-agent
+USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'
+
+# Obey robots.txt rules
+ROBOTSTXT_OBEY = True
+
+# Configure maximum concurrent requests performed by Scrapy (default: 16)
+#CONCURRENT_REQUESTS = 32
+
+# Configure a delay for requests for the same website (default: 0)
+# See https://doc.scrapy.org/en/latest/topics/settings.html#download-delay
+# See also autothrottle settings and docs
+#DOWNLOAD_DELAY = 3
+# The download delay setting will honor only one of:
+#CONCURRENT_REQUESTS_PER_DOMAIN = 16
+#CONCURRENT_REQUESTS_PER_IP = 16
+
+# Disable cookies (enabled by default)
+#COOKIES_ENABLED = False
+
+# Disable Telnet Console (enabled by default)
+#TELNETCONSOLE_ENABLED = False
+
+# Override the default request headers:
+#DEFAULT_REQUEST_HEADERS = {
+#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
+#   'Accept-Language': 'en',
+#}
+
+# Enable or disable spider middlewares
+# See https://doc.scrapy.org/en/latest/topics/spider-middleware.html
+#SPIDER_MIDDLEWARES = {
+#    'myFirstSpider.middlewares.MyfirstspiderSpiderMiddleware': 543,
+#}
+
+# Enable or disable downloader middlewares
+# See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html
+#DOWNLOADER_MIDDLEWARES = {
+#    'myFirstSpider.middlewares.MyfirstspiderDownloaderMiddleware': 543,
+#}
+
+# Enable or disable extensions
+# See https://doc.scrapy.org/en/latest/topics/extensions.html
+#EXTENSIONS = {
+#    'scrapy.extensions.telnet.TelnetConsole': None,
+#}
+
+# Configure item pipelines
+# See https://doc.scrapy.org/en/latest/topics/item-pipeline.html
+ITEM_PIPELINES = {
+    #格式为:'项目名.文件名.类名':优先级(越小越大)
+    'myFirstSpider.mysqlPipeline.MySQLPipeline': 300
+}
+
+# Enable and configure the AutoThrottle extension (disabled by default)
+# See https://doc.scrapy.org/en/latest/topics/autothrottle.html
+#AUTOTHROTTLE_ENABLED = True
+# The initial download delay
+#AUTOTHROTTLE_START_DELAY = 5
+# The maximum download delay to be set in case of high latencies
+#AUTOTHROTTLE_MAX_DELAY = 60
+# The average number of requests Scrapy should be sending in parallel to
+# each remote server
+#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
+# Enable showing throttling stats for every response received:
+#AUTOTHROTTLE_DEBUG = False
+
+# Enable and configure HTTP caching (disabled by default)
+# See https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
+#HTTPCACHE_ENABLED = True
+#HTTPCACHE_EXPIRATION_SECS = 0
+#HTTPCACHE_DIR = 'httpcache'
+#HTTPCACHE_IGNORE_HTTP_CODES = []
+#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

+ 4 - 0
myFirstSpider/spiders/__init__.py

@@ -0,0 +1,4 @@
+# This package will contain the spiders of your Scrapy project
+#
+# Please refer to the documentation for information on how to create and manage
+# your spiders.

BIN
myFirstSpider/spiders/__pycache__/__init__.cpython-36.pyc


BIN
myFirstSpider/spiders/__pycache__/ngaSpider.cpython-36.pyc


+ 35 - 0
myFirstSpider/spiders/ngaSpider.py

@@ -0,0 +1,35 @@
+# -*- coding: utf-8 -*-
+import scrapy
+from scrapy.crawler import CrawlerProcess
+from myFirstSpider.items import MyfirstspiderItem  # 引入item
+
+
+class NgaspiderSpider(scrapy.Spider):
+    name = 'labSpider'
+
+    start_urls = ['http://lab.scrapyd.cn/']
+
+    def parse(self, response):
+        sentence = response.css('div.quote')  # css选择器选择所有句子
+
+        item = MyfirstspiderItem()  # 实例化引入的类
+
+        for v in sentence:  # 循环获取每个句子里面的:内容、作者、标签
+            item['content'] = v.css('.text::text').extract_first()  # 提取名言
+            item['author'] = v.css('.author::text').extract_first()  # 提取作者
+            tags = v.css('.tags .tag::text').extract()  # 提取标签
+            item['tag'] = ','.join(tags)  # 转化为字符串
+            yield item
+            
+            # fileName = '%s-语录.txt' % autor  # 定义文件名
+            # with open(fileName, "a+") as f:  # 不同人的名言保存在不同的txt文档,“a+”以追加的形式
+            #     f.write(text)
+            #     f.write('\n')  # 写入 \n 以达到换行的效果
+            #     f.write('标签:' + tags)
+            #     f.write('\n-------\n')
+            #     f.close()
+        
+        next_page = response.css('li.next a::attr(href)').extract_first()
+        if next_page != None:
+            next_page = response.urljoin(next_page) # 使用urljoin方法将相对路径转换为绝对路径
+            yield scrapy.Request(next_page, callback=self.parse)

+ 11 - 0
scrapy.cfg

@@ -0,0 +1,11 @@
+# Automatically created by: scrapy startproject
+#
+# For more information about the [deploy] section see:
+# https://scrapyd.readthedocs.io/en/latest/deploy.html
+
+[settings]
+default = myFirstSpider.settings
+
+[deploy]
+#url = http://localhost:6800/
+project = myFirstSpider