网络上很多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