网络爬虫Scrapy框架学习1

网络上很多Scrapy都是基于python2.7的,本次使用的环境是python3.7的,在windows10环境下。

1.首先要安装python,https://www.python.org/downloads/windows/

web-based installer 是需要通过联网完成安装的
executable installer 是可执行文件(*.exe)方式安装
embeddable zip file 嵌入式版本,可以集成到其它应用中。

2.安装python后会自带pip,需要升级pip到版本18

python -m pip install --upgrade pip

3.安装Scrapy

pip install scrapy

安装后如果发生错误,如下
错误
https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 下载twisted对应版本的whl文件(本次下载 Twisted‑18.7.0‑cp37‑cp37m‑win_amd64.whl)
cp后面是Python版本,amd64代表64位,下载后运行命令:

pip install Twisted-18.7.0-cp37-cp37m-win_amd64.whl

其中install后面为完整路径名(放在pip执行命令目录)
安装完成后,再次运行:pip install scrapy 即可成功。

当然官方建议使用 Anaconda 或者 Miniconda安装。
(可以把Miniconda看作是Anaconda的简化版)

conda install -c scrapinghub scrapy

其他需要安装的内容

遇到no module named win32API错误,这是因为Python没有自带访问windows系统API的库的,需要下载第三方库。库的名称叫pywin32,可以从网上直接下载,下载链接:http://sourceforge.net/projects/pywin32/files%2Fpywin32/ (下载适合你的Python版本)
我选择了build 221里面的pywin32-221.win-amd64-py3.7.exe 下载安装即可。

4 Scrapy入门教程

例1.新建一个文件 quotes_spider.py 内容如下:

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/tag/humor/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').extract_first(),
                'author': quote.xpath('span/small/text()').extract_first(),
            }

        next_page = response.css('li.next a::attr("href")').extract_first()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

使用以下命令运行爬虫:
scrapy runspider quotes_spider.py -o quotes.json

当您运行该命令时,Scrapy在其中查找Spider定义并通过其爬虫引擎运行它。

通过向start_urls 属性中定义的URL发出请求开始爬行,并调用默认回调方法parse,将响应对象作为参数传递。在parse回调中,我们使用CSS Selector循环遍历quote元素,使用提取的引用文本和作者生成Python dict,查找下一页的链接并使用与parse回调相同的方法安排另一个请求 。

在这里,您会注意到Scrapy的一个主要优点:请求是 异步调度和处理的。这意味着Scrapy不需要等待请求完成和处理,它可以在此期间发送另一个请求或执行其他操作。这也意味着即使某些请求失败或在处理错误时发生错误,其他请求也可以继续运行。

如果出现这样的错误

File "D:\Python37\lib\site-packages\scrapy\extensions\telnet.py", line 12, in <module>
    from twisted.conch import manhole, telnet
  File "D:\Python37\lib\site-packages\twisted\conch\manhole.py", line 154
    def write(self, data, async=False):
                              ^
SyntaxError: invalid syntax

Process finished with exit code 1

解决方法:(原因是python3.7把async修改为了关键字)
将源码manhole.py中的async参数更改为shark(注意更换全部 5个)
可以直接点击错误跳转
也可以通过文件路径查找
改完再运行就OK了

scrapy创建项目

scrapy startproject tutorial

该命令将会创建包含下列内容的 tutorial 目录:

tutorial/
scrapy.cfg
    tutorial/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...

调式模式

需要可以调式的话则在 scrapy.cfg同一层目录下创建 main.py输入一下代码:

from scrapy import cmdline    
cmdline.execute("scrapy crawl spider".split())

其中scrapy crawl spider中的spider是你写的spider的名字,例如你写了一个spider叫tutorial,则 scrapy crawl tutorial,类似直接在cmd里面打scrapy crawl tutorial
最后运行main.py开始爬虫。

例2:在tutorial/spiders目录中新建文件quotes_spider.py 内容如下

import scrapy


class QuotesSpider(scrapy.Spider):
    name = "quotes"

    def start_requests(self):
        urls = [
            'http://quotes.toscrape.com/page/1/',
            'http://quotes.toscrape.com/page/2/',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'quotes-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('Saved file %s' % filename)

如您所见,是scrapy.Spider子类:
name:名称必须是唯一的。
start_requests():必须返回Spider将开始爬行的可迭代请求。后续请求将从这些初始请求中连续生成。
parse():将调用一个方法来处理为每个请求下载的响应。响应参数是TextResponse保存页面内容的实例,并具有处理它的其他有用方法。

请转到项目的顶级目录并运行:
scrapy crawl quotes

猜你喜欢

转载自blog.csdn.net/xianchanghuang/article/details/81632830