0%

利用 Scrapy 编写爬虫程序

简介

Scrapy 是目前使用最广泛的爬虫框架之一,只需要编写非常少的代码就能实现需要的爬虫功能。

Scrapy 基本使用方法

安装

Scrapy 安装非常方便,直接使用 pip 安装

1
pip install scrapy

Scrapy 编写基础爬虫程序

首先使用以下命令自动创建一个爬虫模板:

1
scrapy startproject project_name

接下来在 ‘spider’ 文件夹下建立一个爬虫文件,以下是一段模板程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import scrapy


class DemoSpider(scrapy.Spider):
name = "demo"

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)

该程序包含三大基本组件,name 指定爬虫的名字,必须唯一。start_requests 函数向目标网址发送请求,其中 Request() 类必须指定 url 和 callback 函数,callback 函数的作用为解析 HTML 文件。parse 函数实现 HTML 解析功能,实例中实现的功能为把爬取的 HTML 文件直接存储在本地。接下来的内容将会介绍其他内容提取方法。

使用代理

很多网站比如 google 会部署反爬虫程序来减小服务器压力,如果我们直接使用本地 ip 运行大量爬虫,很有可能会被封掉。在这种情况下我们可以使用代理,这里介绍一个代理网站 https://www.scraperapi.com/,免费版本每个月有 5000 次爬取机会。在程序中定义以下函数:

1
2
3
4
def get_url(url):
payload = {'api_key': API_KEY, 'url': url, 'country_code': 'us'}
proxy_url = 'http://api.scraperapi.com/?' + urlencode(payload)
return proxy_url

其中 API_KEY 在注册账户中可以找到。

运行程序

Scrapy 一般使用命令行来运行

1
scrapy crawl demo -o save_file.jl

其中 save_file.jl 可以使用 jsonline 格式保存爬取的数据。

如果想要使用 pycharm 来调试爬虫程序,可以在 setting.py 同级目录新建一个文件,并编写以下代码:

1
2
3
4
5
from scrapy import cmdline

name = 'demo'
cmd = 'scrapy crawl {0} -o temp.jl'.format(name)
cmdline.execute(cmd.split())

以上代码有一个问题是执行完爬虫程序就直接退出了,无法串行执行两个以上爬虫程序或者对爬取数据进行后续处理,为了解决这个问题,可以使用以下代码:

1
2
3
4
import os

name = 'demo'
os.system('scrapy crawl {0} -o temp.jl'.format(name))

这行代码有一个问题是没有办法停在爬虫程序的断点处,因此没法调试爬虫。所以我现在的策略是使用 cmdline 来调试单个爬虫程序,在单个爬虫程序调试完成后,再使用 os.system 来实现爬虫数据后处理。

Xpath 使用方法

Scrapy 使用 selector 提取 HTML 文件内容,其中 selector 有很多选择,比如 css 和 xpath,这里我们只介绍 xpath。

常用语法

  • //: 提取子目录所有满足条件内容
  • /: 提取直接子目录所有满足条件内容
  • []: 设置提取条件
  • @: 指定属性
  • text(): 提取文字

一下为一个实例:

1
response.xpath('//div//a[@class="gsc_a_at"]//text()').extract()

这段程序提取了所有 div 标签下的所有 a 标签,其中 a 标签需要带有属性 class=”gsc_a_at”,并提取满足条件标签的所有文字。extract() 把 selector 转化成 string,如果有多个满足条件的内容,将形成一个列表。

爬取动态网页

实际生活中有很多网页需要通过 js 来渲染,直接使用 scrapy 无法直接爬取,因此需要借助于 splash 来实现。具体使用方法可以参考这个教程

Reference

[1] Scrapy documentation
[2] scrapy-splash 教程
[3] 学爬虫利器XPath,看这一篇就够了
[4] Concise XPath
[5] scraperapi
[6] Scrapy框架的使用之Item Pipeline的用法
[7] Scrapy中Item Pipeline的用法

本文标题:利用 Scrapy 编写爬虫程序

文章作者:Zhikun Zhang

发布时间:2020年09月11日 - 17:15:48

最后更新:2020年09月12日 - 01:02:58

原始链接:http://zhangzhk.com/2020/09/11/scrapy-tutorial/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。