记一只爬虫
记一只爬虫
新建project
scrapy startproject tutorial
这些文件主要是:
- scrapycfg:项目配置文件,一般不需要改
- tutorial/:项目python模块,代码将从这里导入
- tutorial/items.py:项目items文件
- tutorial/pipelines.py:项目管道文件
- tutorial/settings.py:项目配置文件
- tutorial/spiders/:放置spider的目录
定义Item
Items是将要装载机抓取的数据的容器,跟python里面的字典差不多,但它提供更多的保护,如对未定义的字段填充,以防止拼写错误。
我们通过将需要的item模块化,来控制从dmoz.org获得的站点数据,比如说站点的名字、url和网站描述。定义一下这三种属性的域,编辑一下tuto目录下的items.py
from scrapy.item import Item, Field class DmozItem(Item): title = Field() link = Field() desc = Field()
爬虫(Spider)
Spider是用户编写的类,用于从一个域(或域组)中抓取信息。
它们定义了用于下载URL的初步列表,如何跟踪链接,以及如何来解析这些网页内容用于提取items。
要建立一个Spider,必须为scrapy.spider.BaseSpider创建一个子类,并确定三个主要的、强制的属性:
- name:爬虫的识别名,它必须是唯一的,在不同的爬虫中你必须定义不同的名字
- start_urls:爬虫开始爬的一个URL列表,爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些URLS开始,其他子URL将会从这些起始URL中继承性生成
- parse():爬虫的方法,调用时候传入从每一个URL传回的Response对象作为参数,response将会是parse方法的唯一的一个参数,这个方法负责解析返回的数据,匹配抓取的数据(解析为item)并跟踪更多的URL
在tutorial/spiders目录下,新建一个dmoz_spider.py的文件
from scrapy.spider import BaseSpider
class DmozSpider(BaseSpider): name="dmoz" allowed_domains=["dmoz.org"] start_urls=[ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books", "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources" ]
def parse(self,response): filename=response.url.split("/")[-2] open(filename,‘wb‘).write(response.body)
爬虫运行
在终端输入下面命令:
[KANO@kelvin tutorial]$ scrapy crawl dmoz
你将会得到如下类似输出:
提取Item
Scrapy使用一种叫做XPath selectors的机制,它基于XPath表达式。
关于XPath表达式的提取,可以使用XPath checker插件,而chrome用户则可以直接使用F12查看XPath
Selectors 有三种方法
- path():返回selectors列表, 每一个select表示一个xpath参数表达式选择的节点.
- extract():返回一个unicode字符串,该字符串为XPath选择器返回的数据
- re(): 返回unicode字符串列表,字符串作为参数由正则表达式提取出来
将代码加到原代码中,
from scrapy.spider import BaseSpiderfrom scrapy.selector import HtmlXPathSelector
class DmozSpider(BaseSpider): name = "dmoz" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"]
def parse(self, response): hxs = HtmlXPathSelector(response) sites = hxs.path(‘//fieldset/ul/li‘) for site in sites: title = site.path(‘a/text()‘).extract() link = site.path(‘a/@href‘).extract() desc = site.path(‘text()‘).extract() print title, link
Spiders希望将其抓取的数据存放到Item对象中。为了返回我们抓取数据,spider的最终代码应当是这样:
from scrapy.spider import BaseSpiderfrom scrapy.selector import HtmlXPathSelector
from tutorial.items import DmozItem
class DmozSpider(BaseSpider): name = "dmoz" allowed_domains = ["dmoz.org"] start_urls = [ "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/", "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/" ]
def parse(self, response): hxs = HtmlXPathSelector(response) sites = hxs.path(‘//fieldset/ul/li‘) #sites = hxs.path(‘//ul/li‘) items = [] for site in sites: item = DmozItem() item[‘title‘] = site.path(‘a/text()‘).extract() item[‘link‘] = site.path(‘a/@href‘).extract() item[‘desc‘] = site.path(‘text()‘).extract() items.append(item) return items
保存抓取的数据
保存信息的最简单的方法是通过Feed exports
scrapy crawl dmoz -o items.json -t json
时间: 2024-10-01 02:56:10