内容很多,今天简单学习了scrapy的数据抓取基本流程。
创建项目-更改items-写spiders逻辑。
使用命令:scrapy startproject wo 创建名为wo的项目,结构如下:
C:.
│ scrapy.cfg
│
└─wo
│ items.py
│ pipelines.py
│ settings.py
│ __init__.py
│
└─spiders
__init__.py
说明:
scrapy.cft:项目配置文件,暂时还没学习怎么使用。
items.py:items类似python的字典,在spider数据爬取逻辑实现后保存数据时使用。
pipelines.py:管道,还没学习怎么用。
settings.py:项目配置,还没学怎么用。
__init__.py:暂时没学怎么使用
spiders:spider数据爬取逻辑就在这个目录下实现。
修改items.py:
# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/topics/items.html
from scrapy.item import Item, Field
class woItem(Item):
title=Field()
link=Field()
desc=Field()
增加woppider.py:
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from wo.items import woItem
class wo(BaseSpider):
name='wo'
allowed_wo=['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.select('//ul/li')
items=[]
for site in sites:
item=woItem()
item['title'] = site.select('a/text()').extract()
item['link'] = site.select('a/@href').extract()
item['desc'] = site.select('text()').extract()
items.append(item)
return items
代码说明:
BaseSpider属性:
name:爬虫名字,必须唯一。
start_urls:定义爬取的开始网页地址列表。
parse方法:response有且只有一个参数。
HtmlXPathSelector使用了Xpath来解析数据
//ul/li表示选择所有的ul标签下的li标签
a/@href表示选择所有a标签的href属性
a/text()表示选择a标签文本
a[@href="abc"]表示选择所有href属性是abc的a标签
为了方便使用XPaths,Scrapy提供XPathSelector 类, HtmlXPathSelector (HTML数据解析) 和XmlXPathSelector (XML数据解析)。
为了使用他们你必须通过一个 Response 对象对他们进行实例化操作。你会发现Selector对象展示了文档的节点结构。
因此,第一个实例化的selector必与根节点或者是整个目录有关 。
Selectors 有三种方法
select():返回selectors列表, 每一个select表示一个xpath参数表达式选择的节点.
extract():返回一个unicode字符串,该字符串为XPath选择器返回的数据
re(): 返回unicode字符串列表,字符串作为参数由正则表达式提取出来
scrapy crawl wo -o items.json -t json
所有抓取的items将以JSON格式被保存在新生成的items.json 文件中
语法解释部分基本都是参考网上教程整理,我这里只说自己操作过程中遇到的问题:
1、行缩进的问题
参考网上代码过程中可能有些不可见字符,导致调试一直报错,最后才发现缩进有问题。
2、wospider中定义的name,必须唯一,调用的时候就是取这个name='wo'值。
3、类名wo与spider的文件名“wospider”不能一样,否则import wo工程下的items模块会报错。这里我调试了很久才发现。