网络爬虫:使用Scrapy框架编写一个抓取书籍信息的爬虫服务,爬虫scrapy, 虽然简单易懂,又能非常
网络爬虫:使用Scrapy框架编写一个抓取书籍信息的爬虫服务,爬虫scrapy, 虽然简单易懂,又能非常
上周学习了BeautifulSoup的基础知识并用它完成了一个网络爬虫( 使用Beautiful Soup编写一个爬虫 系列随笔汇总),
BeautifulSoup是一个非常流行的Python网络抓取库,它提供了一个基于HTML结构的Python对象。
虽然简单易懂,又能非常好的处理HTML数据,
但是相比Scrapy而言,BeautifulSoup有一个最大的缺点:慢。
Scrapy 是一个开源的 Python 数据抓取框架,速度快,强大,而且使用简单。
来看一个官网主页上的简单并完整的爬虫:
虽然只有10行左右的代码,但是它的确是一个完整的爬虫服务:
- 当执行scrapy runspider xxx.py命令的时候, Scrapy在项目里查找Spider(蜘蛛🕷️)并通过爬虫引擎来执行它。
- 首先从定义在start_urls里的URL开始发起请求,然后通过parse()方法处理响应。response参数就是返回的响应对象。
- 在parse()方法中,通过一个CSS选择器获取想要抓取的数据。
Scrapy所有的请求都是异步的:
- 也就是说Scrapy不需要等一个请求完成才能处理下一条请求,而是同时发起另一条请求。
- 而且,异步请求的另一个好处是当某个请求失败了,其他的请求不会受到影响。
安装(Mac)
pip install scrapy
其他操作系统请参考完整安装指导:
http://doc.scrapy.org/en/latest/intro/install.html
Scrapy中几个需要了解的概念
Spiders
Spider类想要表达的是:如何抓取一个确定了的网站的数据。比如在start_urls里定义的去哪个链接抓取,parse()方法中定义的要抓取什么样的数据。
当一个Spider开始执行的时候,它首先从start_urls()中的第一个链接开始发起请求,然后在callback里处理返回的数据。
Items
Item类提供格式化的数据,可以理解为数据Model类。
Selectors
Scrapy的Selector类基于lxml库,提供HTML或XML转换功能。以response对象作为参数生成的Selector实例即可通过实例对象的xpath()方法获取节点的数据。
编写一个Web爬虫
接下来将上一个Beautiful Soup版的抓取书籍信息的例子( 使用Beautiful Soup编写一个爬虫 系列随笔汇总)改写成Scrapy版本。
新建项目
scrapy startproject book_project
这行命令会创建一个名为book_project的项目。
编写Item类
即实体类,代码如下:
import scrapy class BookItem(scrapy.Item): title = scrapy.Field() isbn = scrapy.Field() price = scrapy.Field()
编写Spider类
设置这个Spider的名称,允许爬取的域名和从哪个链接开始:
class BookInfoSpider(scrapy.Spider): name = "bookinfo" allowed_domains = ["allitebooks.com", "amazon.com"] start_urls = [ "http://www.allitebooks.com/security/", ]
遍历分页数据
Pythondef parse(self, response): # response.xpath('//a[contains(@title, "Last Page →")]/@href').re(r'(\d+)')[0] num_pages = int(response.xpath('//a[contains(@title, "Last Page →")]/text()').extract_first()) base_url = "http://www.allitebooks.com/security/page/{0}/" for page in range(1, num_pages): yield scrapy.Request(base_url.format(page), dont_filter=True, callback=self.parse_page)
从allitebooks.com获取书籍信息方法
def parse_page(self, response): for sel in response.xpath('//div/article'): book_detail_url = sel.xpath('div/header/h2/a/@href').extract_first() yield scrapy.Request(book_detail_url, callback=self.parse_book_info) def parse_book_info(self, response): title = response.css('.single-title').xpath('text()').extract_first() isbn = response.xpath('//dd[2]/text()').extract_first() item = BookItem() item['title'] = title item['isbn'] = isbn amazon_search_url = 'https://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=' + isbn yield scrapy.Request(amazon_search_url, callback=self.parse_price, meta={ 'item': item })
‘//a’的意思所有的a标签;
‘//a[contains(@title, “Last Page →”)’ 的意思是在所有的a标签中,title属性包涵”Last Page →”的a标签;
extract() 方法解析并返回符合条件的节点数据。
从amazon.com获取书籍价格方法
Pythondef parse_price(self, response): item = response.meta['item'] item['price'] = response.xpath('//span/text()').re(r'\$[0-9]+\.[0-9]{2}?')[0] yield item
启动服务
scrapy crawl bookinfo -o books.csv
-o books.csv 参数的意思是将抓取的Item集合输出到csv文件。
除了CSV格式,Scrapy还支持JSON,XML的格式输入。具体请参考:
http://doc.scrapy.org/en/latest/topics/feed-exports.html#topics-feed-exports
结果:
完整代码请移步GitHub:
https://github.com/backslash112/book_scraper_scrapy
我们处于大数据时代,对数据处理感兴趣的朋友欢迎查看另一个系列随笔:
利用Python进行数据分析 基础系列随笔汇总
相关内容
- 教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神
- 爬虫学习之基于Scrapy的网络爬虫,scrapy网络爬虫,不过不
- 爬虫学习之基于 Scrapy 的爬虫自动登录,scrapy爬虫,我们
- Scrapy 模拟登陆知乎--抓取热点话题,scrapy热点话题, 源
- scrapy采集数据过程中放回下载过大的页面,scrapy采集
- 在线程里运行scrapy的方法,线程运行scrapy,# When you r
- 打印scrapy蜘蛛的抓取树结构,打印scrapy蜘蛛抓取,# Thi
- 通过scrapy抓取网站的sitemap信息,scrapy抓取sitemap,# This
- 从脚本里运行scrapy的代码,脚本scrapy代码,# This snipp
- scrapy 在不同的抓取级别的Request之间传递参数的办法,
评论关闭