翻译自官网,链接:https://docs.scrapy.org/en/latest/intro/overview.html
初识scrapy
scrapy是一个用于爬取网站并且提取结构化数据的应用框架,数据可以用于各种各样用途 ,比如数据挖掘,信息处理,或者历史存档。
虽然scrapy原来被设计用于爬取网页,它也可以被用于通过APIs(比如亚马逊联合网络服务)提取数据或者通用的网络爬虫。
通过一个简单爬虫走进scrapy
为了展示scrapy能带来什么,我们会带你通过最简单的方式运行一个scrapy爬虫。
下面的代码按照分页方式从网站http://quotes.toscrape.com爬取著名语录。
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').get(),
'author': quote.xpath('span/small/text()').get(),
}
next_page = response.css('li.next a::attr("href")').get()
if next_page is not None:
yield response.follow(next_page, self.parse)
代码复制粘贴到文本文件,命名如下quotes_spider.py
,然后使用runspider
命令运行爬虫:
scrapy runspider quotes_spider.py -o quotes.json
运行完成后会生成一个quotes.json
文件,内容是JSON格式,包含文本和作者,看起来像这样:
[{
"author": "Jane Austen",
"text": "\u201cThe person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.\u201d"
},
{
"author": "Groucho Marx",
"text": "\u201cOutside of a dog, a book is man's best friend. Inside of a dog it's too dark to read.\u201d"
},
{
"author": "Steve Martin",
"text": "\u201cA day without sunshine is like, you know, night.\u201d"
},
...]
刚才发生了什么
当你运行命令scrapy runspider quotes_spider.py
,scrapy查找一个内部定义好的爬虫,然后通过爬虫引擎来运行。
爬取操作开始于请求start_urls
属性中定义的URLs(本例中,只有humor类目下的语录URL),然后调用默认回调方法parse
,响应对象作为参数传递。在parse
回调中,使用CSS选择器通过语录元素进行循环操作,yield一个包含提出的语录文字和作者的Python字典,查找指向下个分页的链接,并且使用parse
方法作为回调来规划另外一个请求。
至此你会发现scrapy的一个优势:请求是预定的和异步操作的。这意味着scrapy不需要等待一个请求完成后再进行下一个请求,它可以在同一时间发送另外一个请求或者做其它事情。这也是说其它请求可以继续执行即使某个请求失败或者处理请求时发生错误。
尽管上面的特性可以让你非常快的执行爬取操作(同时发送多个并发请求,以容错的方式)scrapy也允许通过一些设置更优雅地爬取。比如可以设置每个请求之间的下载延迟,根据域或者IP地址限制并发请求数,甚至可以使用自动阈值插件对这些设置进行自动配置。
运行问题:
ImportError: No module named 'win32api'
解决方法:
pip install -i https://pypi.douban.com/simple pypiwin32