windows下安装scrapy:
需要预装很多软件,参考下面博客:
当安装完所有需要的软件后,对于python2.7及以上版本,以自动安装pip工具,可在cmd下使用命令pip install Scrapy直接安装即可,输入scrapy验证是否安装正确
如果网站提供API直接获取数据,会比较方便,不用爬虫,如天气网站API,如:
关于scrapy和Beautiful Soup的使用,可
参考
官网和例子:
scrapy中使用
Beautiful Soup爬天气例子:
http://www.cnblogs.com/lurenjiashuo/p/scrapy-get-weather.html
有些网站scrapy爬不下来,
可以在设置中修改一下爬虫的 USER_AGENT 和 Referer 信息,增加爬虫请求的时间间隔。或者不用scrapy,自己写爬虫程序。
常用命令:
1.创建您的Scrapy项目:
scrapy startproject myproject
该命令将会在
2. 使用spider进行爬取。 scrapy crawl myspider -o file.csv/json等
myproject
目录中创建一个Scrapy项目2. 使用spider进行爬取。 scrapy crawl myspider -o file.csv/json等
3.下载给定的URL,并将获取到的内容送到标准输出。scrapy fetch <url>
scrapy爬虫过程详解:
1.定义容器item,即想要抓取的数据
创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个Item。
import scrapy
class Website(scrapy.Item):
url=scrapy.Field()
name=scrapy.Field()
description=scrapy.Field()
size=scrapy.Field()2.编写爬虫Spider,必须继承 scrapy.Spider 类, 且定义以下三个属性:
- name: 用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。
- start_urls: 包含了Spider在启动时进行爬取的url列表。每个初始URL会初始化Request,完成下载后生成的 Response 对象将会作为唯一的参数传递给parse函数。response返回的是url
- parse() 是spider的一个方法。该方法负责解析返回的数据(Response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。
在回调函数内,您可以使用
选择器(Selectors)
(您也可以使用BeautifulSoup, lxml 或者您想用的任何解析器) 来分析网页内容,并根据分析的数据生成item。以Xpath为例:
使用 XPath 来从页面的HTML源码中选择需要提取的数据
例如:
种子的描述是被包含在 id="description" 的 <div> 标签中:
<div id="description">
Short documentary made for Plymouth City Museum and Art Gallery regarding the setup of an
对应获取描述的XPath表达式: //div[@id='description']
文件大小的信息包含在 id=specifications 的 <div> 的第二个 <p> 标签中:
选择文件大小的XPath表达式:
//div[@id='specifications']/p[2]/text()[2]
例子spider程序:
import scrapy
from dirbot.items import Website
class DmozSpider(scrapy.Spider):
name = "dmoz" # 必须是唯一的,常用该网站domain命名spider
allowed_domains = ["dmoz.org"] # 可选。包含了spider允许爬取的域名(domain)列表(list)。
start_urls = [
" http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
" http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response): # 负责处理response并返回处理的数据以及跟进的URL
#items = []
for site in response.xpath('//ul[@class="directory-url"]/li') :
item = Website()
item['name'] = site.xpath('a/text()').extract()
item['url'] = site.xpath('a/@href').extract()
item['description'] = site.xpath('text()').re('-\s[^\n]*\\r')
yield item
#items.append(item)
#return items
from dirbot.items import Website
class DmozSpider(scrapy.Spider):
name = "dmoz" # 必须是唯一的,常用该网站domain命名spider
allowed_domains = ["dmoz.org"] # 可选。包含了spider允许爬取的域名(domain)列表(list)。
start_urls = [
" http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
" http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response): # 负责处理response并返回处理的数据以及跟进的URL
#items = []
for site in response.xpath('//ul[@class="directory-url"]/li') :
item = Website()
item['name'] = site.xpath('a/text()').extract()
item['url'] = site.xpath('a/@href').extract()
item['description'] = site.xpath('text()').re('-\s[^\n]*\\r')
yield item
#items.append(item)
#return items
3. Item pipline
上面只是把数据保存在json文件中了,如果我们想自己保存在文件或数据库中,这里就要用到 Item Pipeline 了,当Item在Spider中被收集之后,它将会被传递到Item Pipeline中,每个item pipeline组件都需要调用 process_item(item, spider) 方法,这个方法必须返回一个 Item (或任何继承类)对象, 或是抛出 DropItem异常,被丢弃的item将不会被之后的pipeline组件所处理。
写好ITEM_PIPELINES后,还有很重要的一步,就是把 ITEM_PIPELINES
添加到设置文件 settings.py 中。
ITEM_PIPELINES = {
'myproject.pipelines.PricePipeline': 300,
'myproject.pipelines.JsonWriterPipeline': 800,
}
分配给每个类的整型值,确定了他们运行的顺序,item按数字从低到高的顺序,通过pipeline,通常将这些数字定义在0-1000范围内。