初识Scrapy

简介: 为什么使用Scrapy?我们可以用requests和beautifulsoup完成一个实用的爬虫,但如果想大规模爬取的话,我们需要学习Scrapy这个优秀Python框架,学习它的哲学思想,可以帮助我们更好写自己的爬虫。

为什么使用Scrapy?

我们可以用requests和beautifulsoup完成一个实用的爬虫,但如果想大规模爬取的话,我们需要学习Scrapy这个优秀Python框架,学习它的哲学思想,可以帮助我们更好写自己的爬虫。

事前准备

由于Windows存在许多莫名其妙的坑,所以建议安装anaconda这个优秀的python发行版,并且在anaconda目录添加到环境变量中。

  1. 使用<code>create -n scrapy_app python=2 scrapy</code>创建一个预装scrapy的虚拟环境。
  2. 在cmd下启动虚拟环境<code> activate scrapy_app</code>。
  3. <code>conda install -c scrapinghub scrapy</code>安装其他必须库
  4. <code>scrapy bench </code>验证能否正常工作

官方教程

1.新建项目<code>scrapy startproject tutorial</code>

这个命令将会创建如下内容:

img_3b977be4993ede885e93b2120c1452ed.png

2.定义Item

items用来装scraped data,也就是从网页提取的数据,是一类简单的Python字典。比如我们想从stackoverflow提取问题名、链接和描述。那么就可以在items.py做如下定义。

import scrapy
class DmozItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()

3.第一个爬虫(spider)

爬虫是你自定义的类,用于让Scrapy从某个网站提取信息。你需要定义起始的URL(start_urls),如何跟踪链接以及如何检索网页内容并进行提取。
我们可以在命令行中输入<code>scrapy genspider -t basic domz dmoz.org</code>创建一个爬虫,得到spiders/domz.py。
# -- coding: utf-8 --
import scrapy

class DomzSpider(scrapy.Spider):
    name = "domz" #用于定位爬虫
    allowed_domains = ["dmoz.org"] #限定域名,就不会爬到baidu.com了
    start_urls =[
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ] # 起始的URL

    def parse(self, response):
        filename = response.url.split("/")[-2]+'.html'
        with open(filename,'wb') as f:
            f.write(response.body) 
   # parse是Scarpy在请求未指定回调时,用于处理下载响应的默认回调。

进一步想了解scrapy.Spider的话看这里

4.工作吧!爬虫

命令行下输入<code>scrapy crawl domz</code>。
结束后会在项目文件下载生成两个HTML文件。单单下载网页并没有意义,我们需要从网页从提取数据才有意义。

5.数据提取

Scrapy使用基于Xpath或CSS表达式的Scrapy Selectors提取网页数据。
让我们在shell下使用一下Scrapy Selectors吧。<code>scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"</code>

In [1]: response.xpath('//title')
Out[1]: [<Selector xpath='//title' data=u'<title>Open Directory - Computers: Progr'>]

In [2]: response.xpath('//title').extract()
Out[2]: [u'<title>Open Directory - Computers: Programming: Languages: Python: Books</title>']

In [3]: response.xpath('//title/text()')
Out[3]: [<Selector xpath='//title/text()' data=u'Open Directory - Computers: Programming:'>]

In [4]: response.xpath('//title/text()').extract()
Out[4]: [u'Open Directory - Computers: Programming: Languages: Python: Books']

In [5]: response.xpath('//title/text()').re('(\w+):')
Out[5]: [u'Computers', u'Programming', u'Languages', u'Python']

因此,我们可以改写之前dmoz.py中的parse部分。

.......
def parse(self, response):
    for sel in response.xpath('//ui/li'):
        title = sel.xpath('a/text()').extract()
        link = sel.xpath('a/@href').extract()
        desc = sel.xpath('text()').extract()
        print title, link, desc

重新运行<code>scrapy crawl domz</code>
这里我们只是把结果打印出来,实际运行应该是把数据保存下来,首先需要用到之前定义的DmozItem先结构化数据, 继续改写。

from tutorial.items import DmozItem 
...
def parse(self, response):
    for sel in response.xpath('//ui/li'):
        item = DmozItem()
        item['title']' = sel.xpath('a/text()').extract()
        item['link'] = sel.xpath('a/@href').extract()
        item['desc'] = sel.xpath('text()').extract()
        yield item

重新运行<code>scrapy crawl domz</code>

6.链接跟踪

假设你不满足爬取起始页面,想继续爬取起始页面中你感兴趣的链接,那么我么就需要进一步改写之前的爬虫了。

def parse(self, response):
    for href in response.css("ul.directory.dir-col > li > a::attr('href')"):
        url = response.urljoin(href.extract())#构建绝对路径的URL
        yield scrapy.Request(url, callback=self.parse_dir_contents)

def parse_dir_contents(self, response):
    for sel in response.xpath('//ui/li'):
        item = DmozItem()
        item['title']' = sel.xpath('a/text()').extract()
        item['link'] = sel.xpath('a/@href').extract()
        item['desc'] = sel.xpath('text()').extract()
        yield item

这里我们使用parse函数获取网页的url,然后通过scrapy.Request对获取的每一个url调用parse_dir_contents函数,提取数据。

7.数据储存

数据储存有很多方式,可以放在数据库中,由于是教程,我们使用最简单的<code>scrapy crawl domz -o items.json</code>把数据放在json文件中。

目录
相关文章
|
Shell Perl
如何写一个脚本(附送一个脚本)
为什么要写脚本 为了把时间放在更有意义的事情上 生信人每天会做大量的重复的操作,例如一个流程会用不同的参数跑好几遍找合适的参数,不断把一个格式的数据转换成另一种格式。
2357 0
|
3天前
|
数据采集 人工智能 安全
|
12天前
|
云安全 监控 安全
|
4天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1070 151
|
4天前
|
编解码 人工智能 机器人
通义万相2.6,模型使用指南
智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话
|
17天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1744 9
|
9天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
688 152
|
11天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
655 12