scrapy学习笔记

爬虫Scrapy框架制作爬虫 制作爬虫 (spiders/itcastSpider.py) 爬虫功能要分两步: 爬数据 在当前目录下输入命令,将在mySpider/spider目录下创建一个名为itcast的爬虫,并指定爬取域的范围: scrapy genspider itcast “itcast.cn” 打开 mySpider/spider目录里的 itcast.py,默认增加了下列代码: import scrapy class ItcastSpider(scrapy.Spider): name = “itcast” allowed 阅读详情

scrapy是python最有名的爬虫框架之一,可以很方便的进行web抓取,并且提供了很强的定制型,这里记录简单学习的过程和在实际应用中会遇到的一些常见问题

Scrapy运行流程大概如下:

  1. 引擎从调度器中取出一个链接(URL)用于接下来的抓取
  2. 引擎把URL封装成一个请求(Request)传给下载器
  3. 下载器把资源下载下来,并封装成应答包(Response)
  4. 爬虫解析Response
  5. 解析出实体(Item),则交给实体管道进行进一步的处理
  6. 解析出的是链接(URL),则把URL交给调度器等待抓取

一、安装

在安装scrapy之前有一些依赖需要安装,否则可能会安装失败,scrapy的选择器依赖于lxml,还有Twisted网络引擎,下面是ubuntu下安装的过程

1. linux下安装

# 1. 安装xml依赖库
$ sudo apt-get install libxml2 libxml2-dev
$ sudo apt-get install libxslt1-dev
$ sudo apt-get install python-libxml2

# 2. 安装lxml
$ sudo pip install lxml

# 3. 安装Twisted(版本可以换成最新的),用pip也可以,如果失败的话下载源码安装,如下
$ wget https://pypi.python.org/packages/6b/23/8dbe86fc83215015e221fbd861a545c6ec5c9e9cd7514af114d1f64084ab/Twisted-16.4.1.tar.bz2#md5=c6d09bdd681f538369659111f079c29d
$ tar xjf Twisted-16.4.1.tar.bz2
$ cd Twisted-16.4.1
$ sudo python setup.py install

# 3. 安装scrapy
$ sudo pip install scrapy

http://lxml.de/installation.html

2. Mac下安装

# 安装xml依赖库
$ xcode-select —install

# 其实相关依赖pip会自动帮我们装上
$ pip install scrapy

mac下安装有时候会失败,建议使用virtualenv安装在独立的环境下,可以减少一些问题,因为mac系统自带python,例如一些依赖库依赖的一些新的版本,而升级新版本会把旧版本卸载掉,卸载可能会有权限的问题

二、基本使用

1. 初始化scrapy项目

我们可以使用命令行初始化一个项目

$ scrapy startproject tutorial

 

这里可以查看scrapy更多其他的命令

初始化完成后,我们得到下面目录结构

scrapy.cfg:         项目的配置文件
tutorial/:          该项目的python模块, 在这里添加代码
    items.py:       项目中的item文件
    pipelines.py:   项目中的pipelines文件.
    settings.py:    项目全局设置文件.
    spiders/        爬虫模块目录

 

我们先看一下scrapy的处理流程图

scrapy由下面几个部分组成

  • spiders:爬虫模块,负责配置需要爬取的数据和爬取规则,以及解析结构化数据
  • items:定义我们需要的结构化数据,使用相当于dict
  • pipelines:管道模块,处理spider模块分析好的结构化数据,如保存入库等
  • middlewares:中间件,相当于钩子,可以对爬取前后做预处理,如修改请求header,url过滤等

我们先来看一个例子,在spiders目录下新建一个模块DmozSpider.py

import scrapy

class DmozSpider(scrapy.Spider):
    # 必须定义
    name = "dmoz"
    # 初始urls
    start_urls = [
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ]

    # 默认response处理函数
    def parse(self, response):
        # 把结果写到文件中
        filename = response.url.split("/")[-2]
        with open(filename, 'wb') as f:
            f.write(response.body)

 

打开终端进入根目录,执行下面命令

$ scrapy crawl dmoz

 

爬虫开始爬取start_urls定义的url,并输出到文件中,最后输出爬去报告,会输出爬取得统计结果

2016-09-13 10:36:43 [scrapy] INFO: Spider opened
2016-09-13 10:36:43 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-09-13 10:36:43 [scrapy] DEBUG: Telnet console listening on 127.0.0.1:6023
2016-09-13 10:36:44 [scrapy] DEBUG: Crawled (200) <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/> (referer: None)
2016-09-13 10:36:45 [scrapy] DEBUG: Crawled (200) <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> (referer: None)
2016-09-13 10:36:45 [scrapy] INFO: Closing spider (finished)
2016-09-13 10:36:45 [scrapy] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 548,
 'downloader/request_count': 2,
 'downloader/request_method_count/GET': 2,
 'downloader/response_bytes': 16179,
 'downloader/response_count': 2,
 'downloader/response_status_count/200': 2,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2016, 9, 13, 2, 36, 45, 585113),
 'log_count/DEBUG': 3,
 'log_count/INFO': 7,
 'response_received_count': 2,
 'scheduler/dequeued': 2,
 'scheduler/dequeued/memory': 2,
 'scheduler/enqueued': 2,
 'scheduler/enqueued/memory': 2,
 'start_time': datetime.datetime(2016, 9, 13, 2, 36, 43, 935790)}
2016-09-13 10:36:45 [scrapy] INFO: Spider closed (finished)

 

这里我们完成了简单的爬取和保存的操作,会在根目录生成两个文件Resources和Books

2. 通过代码运行爬虫

每次进入控制台运行爬虫还是比较麻烦的,而且不好调试,我们可以通过CrawlerProcess通过代码运行爬虫,新建一个模块run.py

from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings

from spiders.DmozSpider import DmozSpider

# 获取settings.py模块的设置
settings = get_project_settings()
process = CrawlerProcess(settings=settings)

# 可以添加多个spider
# process.crawl(Spider1)
# process.crawl(Spider2)
process.crawl(DmozSpider)

# 启动爬虫,会阻塞,直到爬取完成
process.start()

 

参考:http://doc.scrapy.org/en/latest/topics/practices.html#run-scrapy-from-a-script

三、Scrapy类

如上面的DmozSpider类,爬虫类继承自scrapy.Spider,用于构造Request对象给Scheduler

1. 常用属性与方法

属性

  • name:爬虫的名字,必须唯一(如果在控制台使用的话,必须配置)
  • start_urls:爬虫初始爬取的链接列表
  • parse:response结果处理函数
  • custom_settings:自定义配置,覆盖settings.py中的默认配置

方法

  • start_requests:启动爬虫的时候调用,默认是调用make_requests_from_url方法爬取start_urls的链接,可以在这个方法里面定制,如果重写了该方法,start_urls默认将不会被使用,可以在这个方法里面定制一些自定义的url,如登录,从数据库读取url等,本方法返回Request对象
  • make_requests_from_url:默认由start_requests调用,可以配置Request对象,返回Request对象
  • parse:response到达spider的时候默认调用,如果在Request对象配置了callback函数,则不会调用,parse方法可以迭代返回Item或Request对象,如果返回Request对象,则会进行增量爬取

2. Request与Response对象

每个请求都是一个Request对象,Request对象定义了请求的相关信息(url, method, headers, body, cookie, priority)和回调的相关信息(meta, callback, dont_filter, errback),通常由spider迭代返回

其中meta相当于附加变量,可以在请求完成后通过response.meta访问('handle_httpstatus_all':True)(允许所有的状态码)

请求完成后,会通过Response对象发送给spider处理,常用属性有(url, status, headers, body, request, meta, )

详细介绍参考官网

看下面这个例子

from scrapy import Spider
from scrapy import Request

class TestSpider(Spider):
    name = 'test'
    start_urls = [
        "http://www.qq.com/",
    ]

    def login_parse(self, response):
        ''' 如果登录成功,手动构造请求Request迭代返回 '''
        print response
        for i in range(0, 10):
            yield Request('http://www.example.com/list/1?page={0}'.format(i))

    def start_requests(self):
        ''' 覆盖默认的方法(忽略start_urls),返回登录请求页,制定处理函数为login_parse '''
        return Request('http://www.example.com/login', method="POST" body='username=bomo&pwd=123456', callback=self.login_parse)


    def parse(self, response):
        ''' 默认请求处理函数 '''
        print response

 

四、Selector

上面我们只是爬取了网页的html文本,对于爬虫,我们需要明确我们需要爬取的结构化数据,需要对原文本进行解析,解析的方法通常有下面这些

  • 普通文本操作
  • 正则表达式:re
  • Dom树操作:BeautifulSoup
  • XPath选择器:lxml

scrapy默认支持选择器的功能,自带的选择器构建与lxml之上,并对其进行了改进,使用起来更为简洁明了

1. XPath选择器

XPpath是标准的XML文档查询语言,可以用于查询XML文档中的节点和内容,关于XPath语法,可以参见这里

先看一个例子,通过html或xml构造Selector对象,然后通过xpath查询节点,并解析出节点的内容

from scrapy import Selector

html = '<html><body><span>good</span><span>buy</span></body></html>'
sel = Selector(text=html)
nodes = sel.xpath('//span')
for node in nodes:
    print node.extract()

 

Selector相当于节点,通过xpath去到子节点集合(SelectorList),可以继续搜索,通过extract方法可以取出节点的值,extract方法也可以作用于SelectorList,对于SelectorList可以通过extract_first取出第一个节点的值

  • 通过text()取出节点的内容
  • 通过@href去除节点属性值(这里是取出href属性的值)
  • 直接对节点取值,则是输出节点的字符串

2. CSS选择器

除了XPath选择器,scrapy还支持css选择器

html = """
        <html>
            <body>
                <span>good</span>
                <span>buy</span>
                <ul>
                    <li class="video_part_lists">aa<li>
                    <li class="video_part_lists">bb<li>
                    <li class="audio_part_lists">cc<li>
                    <li class="video_part_lists">
                        <a href="/">主页</a>
                    <li>
                </ul>
            </body>
        </html>
        """
sel = Selector(text=html)

# 选择class为video_part_lists的li节点
lis = sel.css('li.video_part_lists')

for li in lis:
    # 选择a节点的属性
    print li.css('a::attr(href)').extract()

 

关于css选择器更多的规则,可以见w3c官网

五、Item类

上面我们只是爬取了网页的html文本,对于爬虫,我们需要明确我们需要爬取的结构化数据,我们定义一个item存储分类信息,scrapy的item继承自scrapy.Item

from scrapy import Item, Field

class DmozItem(Item):
    title = Field()
    link = Field()
    desc = Field()

scrapy.Item的用法与python中的字典用法基本一样,只是做了一些安全限制,属性定义使用Field,这里只是进行了声明,而不是真正的属性,使用的时候通过键值对操作,不支持属性访问

what, 好坑爹,这意味着所有的属性赋值都得用字符串了,这里有解释(还是没太明白)

修改DmozSpider的parse方法

class DmozSpider(scrapy.Spider):
    ...
    def parse(self, response):
        for sel in response.xpath('//ul/li'):
            dmoz_item = DmozItem()
            dmoz_item['title'] = sel.xpath('a/text()').extract()
            dmoz_item['link'] = sel.xpath('a/@href').extract()
            dmoz_item['desc'] = sel.xpath('text()').extract()
            print dmoz_item

 

六、Pipeline

spider负责爬虫的配置,item负责声明结构化数据,而对于数据的处理,在scrapy中使用管道的方式进行处理,只要注册过的管道都可以处理item数据(处理,过滤,保存)

下面看看管道的声明方式,这里定义一个预处理管道PretreatmentPipeline.py,如果item的title为None,则设置为空字符串

class PretreatmentPipeline(object):
    def process_item(self, item, spider):
        if item['title']:
            # 不让title为空
            item['title'] = ''
        return item

 

再定义一个过滤重复数据的管道DuplicatesPipeline.py,当link重复,则丢弃

from scrapy.exceptions import DropItem

class DuplicatesPipeline(object):
    def __init__(self):
        self.links = set()

    def process_item(self, item, spider):
        if item['link'] in self.links:
            # 跑出DropItem表示丢掉数据
            raise DropItem("Duplicate item found: %s" % item)
        else:
            self.links.add(item['link'])
            return item

 

最后可以定义一个保存数据的管道,可以把数据保存到数据库中

from scrapy.exceptions import DropItem
from Database import Database

class DatabasePipeline(object):
    def __init__(self):
        self.db = Database

    def process_item(self, item, spider):
        if self.db.item_exists(item['id']):
            self.db.update_item(item)
        else:
            self.db.insert_item(item)

 

定义好管道之后我们需要配置到爬虫上,我们在settings.py模块中配置,后面的数字表示管道的顺序

ITEM_PIPELINES = {
    'pipelines.DuplicatesPipeline.DuplicatesPipeline': 1,
    'pipelines.PretreatmentPipeline.PretreatmentPipeline': 2,
}

 

我们也可以为spider配置单独的pipeline

class TestSpider(Spider):
    # 自定义配置
    custom_settings = {
        # item处理管道
        'ITEM_PIPELINES': {
            'tutorial.pipelines.FangDetailPipeline.FangDetailPipeline': 1,
        },
    }
    ...

 

除了process_item方法外,pipeline还有open_spider和spider_closed两个方法,在爬虫启动和关闭的时候调用

七、Rule

爬虫的通常需要在一个网页里面爬去其他的链接,然后一层一层往下爬,scrapy提供了LinkExtractor类用于对网页链接的提取,使用LinkExtractor需要使用CrawlSpider爬虫类中,CrawlSpider与Spider相比主要是多了rules,可以添加一些规则,先看下面这个例子,爬取链家网的链接

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class LianjiaSpider(CrawlSpider):
    name = "lianjia"

    allowed_domains = ["lianjia.com"]

    start_urls = [
        "http://bj.lianjia.com/ershoufang/"
    ]

    rules = [
        # 匹配正则表达式,处理下一页
        Rule(LinkExtractor(allow=(r'http://bj.lianjia.com/ershoufang/pg\s+$',)), callback='parse_item'),

        # 匹配正则表达式,结果加到url列表中,设置请求预处理函数
        # Rule(FangLinkExtractor(allow=('http://www.lianjia.com/client/', )), follow=True, process_request='add_cookie')
    ]

    def parse_item(self, response):
        # 这里与之前的parse方法一样,处理
        pass

1. Rule对象

Role对象有下面参数

  • link_extractor:链接提取规则
  • callback:link_extractor提取的链接的请求结果的回调
  • cb_kwargs:附加参数,可以在回调函数中获取到
  • follow:表示提取的链接请求完成后是否还要应用当前规则(boolean),如果为False则不会对提取出来的网页进行进一步提取,默认为False
  • process_links:处理所有的链接的回调,用于处理从response提取的links,通常用于过滤(参数为link列表)
  • process_request:链接请求预处理(添加header或cookie等)

2. LinkExtractor

LinkExtractor常用的参数有:

  • allow:提取满足正则表达式的链接
  • deny:排除正则表达式匹配的链接(优先级高于allow)
  • allow_domains:允许的域名(可以是str或list)
  • deny_domains:排除的域名(可以是str或list)
  • restrict_xpaths:提取满足XPath选择条件的链接(可以是str或list)
  • restrict_css:提取满足css选择条件的链接(可以是str或list)
  • tags:提取指定标签下的链接,默认从a和area中提取(可以是str或list)
  • attrs:提取满足拥有属性的链接,默认为href(类型为list)
  • unique:链接是否去重(类型为boolean)
  • process_value:值处理函数(优先级大于allow)

关于LinkExtractor的详细参数介绍见官网

注意:如果使用rules规则,请不要覆盖或重写CrawlSpider的parse方法,否则规则会失效,可以使用parse_start_urls方法

八、Middleware

从最开始的流程图可以看到,爬去一个资源链接的流程,首先我们配置spider相关的爬取信息,在启动爬取实例后,scrapy_engine从Spider取出Request(经过SpiderMiddleware),然后丢给Scheduler(经过SchedulerMiddleware),Scheduler接着把请求丢给Downloader(经过DownloadMiddlware),Downloader把请求结果丢还给Spider,然后Spider把分析好的结构化数据丢给Pipeline,Pipeline进行分析保存或丢弃,这里面有4个角色

scrapy有下面三种middlewares

  • SpiderMiddleware:通常用于配置爬虫相关的属性,引用链接设置,Url长度限制,成功状态码设置,爬取深度设置,爬去优先级设置等
  • DownloadMiddlware:通常用于处理下载之前的预处理,如请求Header(Cookie,User-Agent),登录验证处理,重定向处理,代理服务器处理,超时处理,重试处理等
  • SchedulerMiddleware(已经废弃):为了简化框架,调度器中间件已经被废弃,使用另外两个中间件已经够用了

1. SpiderMiddleware

爬虫中间件有下面几个方法

  • process_spider_input:当response通过spider的时候被调用,返回None(继续给其他中间件处理)或抛出异常(不会给其他中间件处理,当成异常处理)
  • process_spider_output:当spider有item或Request输出的时候调动
  • process_spider_exception:处理出现异常时调用
  • process_start_requests:spider当开始请求Request的时候调用

下面是scrapy自带的一些中间件(在scrapy.spidermiddlewares命名空间下)

  • UrlLengthMiddleware
  • RefererMiddleware
  • OffsiteMiddleware
  • HttpErrorMiddleware
  • DepthMiddleware

我们自己实现一个SpiderMiddleware

TODO

 

参考链接:http://doc.scrapy.org/en/latest/topics/spider-middleware.html

2. DownloaderMiddleware

下载中间件有下面几个方法

  • process_request:请求通过下载器的时候调用
  • process_response:请求完成后调用
  • process_exception:请求发生异常时调用
  • from_crawler:从crawler构造的时候调用
  • from_settings:从settings构造的时候调用
  • ``

更多详细的参数解释见这里

在爬取网页的时候,使用不同的User-Agent可以提高请求的随机性,定义一个随机设置User-Agent的中间件RandomUserAgentMiddleware

import random

class RandomUserAgentMiddleware(object):
    """Randomly rotate user agents based on a list of predefined ones"""

    def __init__(self, agents):
        self.agents = agents

    # 从crawler构造,USER_AGENTS定义在crawler的配置的设置中
    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.settings.getlist('USER_AGENTS'))

    # 从settings构造,USER_AGENTS定义在settings.py中
    @classmethod
    def from_settings(cls, settings):
        return cls(settings.getlist('USER_AGENTS'))

    def process_request(self, request, spider):
        # 设置随机的User-Agent
        request.headers.setdefault('User-Agent', random.choice(self.agents))

 

在settings.py设置USER_AGENTS参数

USER_AGENTS = [
    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
    "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
    "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
    "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
    "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
    "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
    "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
    "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
    "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
]

 

配置爬虫中间件的方式与pipeline类似,第二个参数表示优先级

# 配置爬虫中间件
SPIDER_MIDDLEWARES = {
    'myproject.middlewares.CustomSpiderMiddleware': 543,
    # 如果想禁用默认的中间件的话,可以设置其优先级为None
    'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': None,
}

# 配置下载中间件
DOWNLOADER_MIDDLEWARES = {
    'myproject.middlewares.RandomUserAgentMiddleware': 543,
    'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': None,
}

 

3. 代理服务器

爬虫最怕的就是封ip,这时候就需要代理服务器来爬取,scrapy设置代理服务器非常简单,只需要在请求前设置Request对象的meta属性,添加proxy值即可,通常我们可以通过中间件来做

class ProxyMiddleware(object):
    def process_request(self, request, spider):
        proxy = 'https://178.33.6.236:3128'     # 代理服务器
        request.meta['proxy'] = proxy

 

九、缓存

scrapy默认已经自带了缓存的功能,通常我们只需要配置即可,打开settings.py

# 打开缓存
HTTPCACHE_ENABLED = True

# 设置缓存过期时间(单位:秒)
#HTTPCACHE_EXPIRATION_SECS = 0

# 缓存路径(默认为:.scrapy/httpcache)
HTTPCACHE_DIR = 'httpcache'

# 忽略的状态码,例如:302
HTTPCACHE_IGNORE_HTTP_CODES = []

# 缓存模式(文件缓存)
HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

十、多线程

scrapy网络请求是基于Twisted,而Twisted默认支持多线程,而且scrapy默认也是通过多线程请求的,并且支持多核CPU的并发,通常只需要配置一些参数即可

# 默认Item并发数:100
CONCURRENT_ITEMS = 100

# 默认Request并发数:16
CONCURRENT_REQUESTS = 16

# 默认每个域名的并发数:8
CONCURRENT_REQUESTS_PER_DOMAIN = 8

# 每个IP的最大并发数:0表示忽略
CONCURRENT_REQUESTS_PER_IP = 0
用Scrapy爬取网站时总获取不到源代码的解决办法 运行scrapy crawl gupiao,报错如下: 2017-11-06 16:28:19 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: gupiaosp ider) 2017-11-06 16:28:19 [scrapy.utils.log] INFO: Overridden settings: {'BOT_NAME': ' ... 阅读详情

相关推荐

Scrapy学习笔记(1)

我是scrapy初学者,所以只是爬取一些小资源拿来练练手,scrapy还有很多强大的功能没学,所以把这篇笔记当成初学者的笔记也好。因为总共学习编程不到半年,拿爬虫练手,即可以爬取有趣的资源,也会对编程更加热爱,提高编程能力。本次学习的scrapy就是爬虫很强大的框架。我参考的是scrapy的官方英文文档,不过实例都是我自己写的 本笔记假设你已经安装了scrapy。 我在装scrapy的时候也遇到

BRSGengetsu的博客 803

Scrapy 修改爬虫结束时统计数据中的时间为当前系统时间

Scrapy 修改爬虫结束时统计数据中的时间为当前系统时间一、问题背景二、问题分析三、解决方法四、效果展示 一、问题背景 scrapy 在每次运行结束后都会显示一堆统计数据信息,其中是有统计时间数据的,但是!!!那个时间是 UTC 时间(0时区),不是我们平时习惯的系统本地时间,而且里面的爬虫总运行时间是以秒计算的,不符合我们的日常习惯,于是我翻了下scrapy 的源码,找到其中相关的内容并将其重写了一遍,感觉还行,各位看官随缘取之! 二、问题分析 通过日志信息,找到对应的统计爬虫运行时间的类:scrapy

涞公子的博客 1229

STM32F103C8T6+A4988驱动42步进电机全流程(附接线图+代码解析)

本文详细介绍了使用STM32F103C8T6单片机与A4988驱动模块控制42步进电机的完整流程。内容涵盖硬件接线图解析、电流设置、GPIO驱动代码编写以及细分控制等核心实践,旨在帮助嵌入式开发者和DIY爱好者快速实现精准运动控制,适用于3D打印机、CNC等需要精密定位的项目。

Python的专栏 792

scrapy爬虫错误一:无法爬到期望的数据

最近在开始学习scrapy爬虫,遇到了一处很坑的地方,在屏幕上输出的debug信息总是没有任何结果就直接提示:  [scrapy.statscollectors] INFO: Dumping Scrapy stats ............... ............. [scrapy.core.engine] INFO: Spider closed (finished),然后程序就...

qq_15054345的博客 8351

CARLA 0.9.15从零开始:环境搭建与基础场景实战指南

本文是CARLA 0.9.15从零开始的完整环境搭建与基础运行教程。详细介绍了在Linux系统下配置Python环境、下载安装CARLA核心软件包、启动服务器以及运行第一个基础场景的步骤。重点演示了如何通过Python客户端脚本生成随机车流,并手动控制EGO车辆在仿真城市中行驶,为自动驾驶算法开发构建了坚实的仿真测试基础。

weixin_29053383的博客 776

CST实战:5分钟搞定圆极化天线轴比分析(含远场设置技巧)

本文提供了一份CST Studio Suite圆极化天线轴比分析的实战指南。文章详细讲解了轴比的概念与工程标准,并重点演示了如何正确设置远场监视器以获取Axial Ratio数据,包括关键步骤与后处理技巧。最后,通过植入式天线在生物组织环境中的案例,分析了复杂环境对轴比性能的影响及优化思路。

nokia的博客 992

Spider closed (finished) 没完成

我猜测是scrapy的robot协议没关闭吧? settings.py中 1 2 #robots协议,True的话是遵守协议,所以要False关掉 ROBOTSTXT_OBEY=False

jacke121的专栏 1万+

Hermes Agent vs OpenClaw:2026 年开源 AI Agent 框架深度对比

两款 2026 年最受关注的开源 AI Agent 框架,一个主打「自进化」,一个聚焦「网关路由」——它们究竟有何不同?本文将从架构原理、核心机制、使用方式到适用场景,为你全面拆解。无论你是 AI 研究者、开发者,还是想用 AI 提升工作效率的个人用户,这篇文章都将帮助你做出最适合的选择

程序猿_三产 3738

scrapy学习笔记0827

我们自定义的数据类主要放在item.py文件中,一个文件可以定义多个数据类。Item基类:自定义数据类(如BookItem)的基类。Field类:用来描述自定义数据类包含哪些字段(如name、price等)。自定义一个数据类,只需继承Item,并创建一系列Field对象的类 属性(类似于在Django中自定义Model)即可。如下,你甚至还可以在自己自定义的代码上进行扩展。

m0_56366541的博客 1083

OpenFOAM-v2006重叠网格挖洞问题实战:如何手动修复overset代码中的边缘识别缺陷

本文深入探讨了OpenFOAM-v2006中重叠网格挖洞问题的实战解决方案,重点修复overset代码中的边缘识别缺陷。通过逆向工程解析挖洞决策机制,设计最小侵入式的函数override方案,并建立多级验证体系,有效解决了网格挖洞区域覆盖不全的问题,提升了计算流体动力学模拟的准确性和可靠性。

weixin_29216049的博客 429

uniapp ios原生插件开发 (framework,cocoapods)

已知UniApp的插件开发方式有两种, 第一种 Xcode Framework的方式,这种方式是官方指定的方式。 这种方式的优点就是简单直接, 但也有不足,比如当插件需要引入一些三方库时,操作起来就不是那么方便。 而使用Cocoapods则可以很方便的引入三方库。 接下来,本文探索使用Cocoapods的方式来进行UniApp插件开发。

Rey的技术博客 9821

Scrapy入门———Scrapy1.6官方教程学习笔记

如果已经安装好了Scrapy,就可以开始下面的教程了。如果没有,可以看我的博文《安装Scrapy》进行安装后,再回来看哦!接下来,我们将爬取 quotes.toscrape.com中的名人名言,作为本教程的素材。入门教程共下列五步:创建一个新的Scrapy项目写一个spider去爬取网页和提取数据使用命令行输出爬取的数据根据链接递归爬取(爬取每一个链接)使用spider 参数创建一个Scrapy项

BennyShi1998的博客 1万+

iStoreOS路由器(openwrt软路由) AdGuard Home 客户端 IP 总是 localhost(127.0.0.1)?这样设置让你精准识别真实IP!

在iStoreOS等软路由上部署AdGuard Home时,客户端IP常显示为localhost(127.0.0.1)。本文详细介绍如何让adguardhome直接识别客户端真实IP🌐,帮助你实现网络流量的精准追踪和管理。🔍

XiaoqiangClub的博客 2247

Scrapy:学习笔记(1)——XPath

Scrapy:学习笔记(1)——XPath 1、快速开始   XPath是一种可以快速在HTML文档中选择并抽取元素、属性和文本的方法。   在Chrome,打开开发者工具,可以使用$x工具函数来使用XPath来选择元素,比如选中所有的超链接。    1.1、XPath的基本格式   XPath通过"路径表达式"(Path Expression)来选择节点。   在形式上,"路径表达...

weixin_30535167的博客 170

PCIe 全解析笔记:从协议本质到工程实现

学习 PCIe,最容易陷入的误区是直接跳进协议手册(Base Spec 1300 多页),然后在 TLP 字段、LTSSM 状态、Ordering Rules 中迷失方向。正确的思维路径历史维度:从 PCI 到 PCIe,解决了什么核心矛盾?抽象维度:协议栈分层的真正意图是什么?工程维度:高速串行链路面临哪些物理挑战?协议如何应对?系统维度:作为 CPU 与外设的"动脉",PCIe 如何融入整个计算机体系?带着这四个视角去看每一个细节,知识才能内化为认知。

m0_46644103的博客 261

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Scrapy框架学习笔记(1)——Scrapy框架中Downloader Middleware核心方法:流程图解

Scrapy框架中Downloader Middleware核心方法:process_request,process_response,process_exception个人学习笔记说明参考书目及网站学习笔记 说明 最近在学习python Scrapy框架的使用,在看Downloader Middleware的核心方法时候,发现可以用visio画个有关三个核心方法(process_request(...

qq_32162235的博客 909

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

scrapy爬虫入门学习笔记(一)

scrapy爬虫入门学习笔记(一)scrapy框架 ,爬取腾讯社招信息

qq_42016338的博客 403

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Scrapy学习笔记

Python中Scrapy是一个非常方便的web抓取框架,由于个人在本学期才初步接触Python,学习过程中更多是秉承着实用的原则来进行学习,主要自学了用Python设计网页爬虫的部分,其中也被正则表达式弄得稀里糊涂(感觉正则表达式和编译原理一样,都是人类顶级大脑的智慧结晶,但短期内难以上升到...

chouqiang0763的博客 218

scrapy进阶学习笔记

1.scrapy工作流程 其流程可以描述如下: 1.爬虫中起始的url构造成request对象–>爬虫中间件–>引擎–>调度器 2.调度器把request–>引擎–>下载中间件—>下载器 3.下载器发送请求,获取response响应---->下载中间件---->引擎—>爬虫中间件—>爬虫 4.爬虫提取url地址,组装成request对象---->爬虫中间件—>引擎—>调度器,重复步骤2 5.爬虫提取数据—>引擎—>管道

weixin_45066966的博客 747

Scrapy框架学习笔记

一.scrapy 1.创建scrapy项目: 终端输入 scrapy startproject 项目名 2.项目组成: spiders __init__.py 自定义的爬虫文件.py ‐‐‐》由我们自己创建,是实现爬虫核心功能的文件 __init__.py items.py ‐‐‐》定义数据结构的地方,是一个继承自scrapy.Item的类 middlewares.py ‐‐‐》中间件 代理 pipelines.py ‐‐‐》管道文件,里面只有一个类,用于处理下载数据的后续处理 默认是300优先级,值越小优

weixin_48076656的博客 725

Scrapy学习笔记-Scrapy入门Spiders

Spiders是定义如何爬取某个站点(或一组站点)的类,包括如何执行爬网(即跟踪链接)以及如何从其页面中提取结构化数据(即抓取项)。 换句话说,Spider是您定义自定义行为的地方,该行为用于爬网和解析特定站点(或在某些情况下为一组站点)的页面。 对于spiders,抓取周期经历如下过程: 首先,生成初始请求以爬网第一个URL,然后指定要调用的回调函数,并从这些请求中下载响应。要执行的第一个请求...

肥叔菌的博客 9230
上一篇: scrapy常见问题
下一篇: 使用python来访问Hadoop HDFS存储实现文件的操作
唐僧不爱八戒
博客等级 码龄9年 158粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值