简单的解释一下上面的图:
爬虫处理的原材料是一个或多个url,爬取时Sheduler会把一个url分配给Downloader来进行一次网络的request请求,请求完成后Downloader再把所得到的response传到Spiders,如果返回的数据是我们需要的,数据就会被处理成相应的Item交给ItemPipeline来进行存储等处理。如果返回的仍然是要处理的url,那么就要交由Scheduler就行再一次的处理过程。
3.Scrapy的安装
sudo pip_install scrapy 或 sudo easy_intall scrapy
输入密码安装完成。输用 scrapy 如果没有 command not found 就表示已经安装成功。
4.创建项目
scrapy startproject project_name
如果看到上面的提示,那么我们的项目就创建成功了。切换到项目录下,我们会看到如下的目录结构
appScrapy/
scrapy.cfg 整个项目的配制信息
appScrapy/ 存放所有python定制模块的文件夹
init.py
items.py 保存爬取到的的数据的数据结构
pipelines.py 数据流处理文件,对爬取的数据流进行处理
settings.py 设置文件,在这里设置数据库等
spiders/ 存放我们定制的爬虫
init.py
…
我们来找全目标,appStore的娱乐排行榜https://itunes.apple.com/cn/genre/ios-yu-le/id6016?mt=8
我们要爬取的数据就是列表中的app名字跟其相应的具体信息的url。
首先我们来定制我们用来保存数据类型的 items.py,打开items.py,境加后的代码如下:
import scrapy
class AppscrapyItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
url = scrapy.Field()
简单说明一下,所有item都继承于scrapy.Item,里面的字段都是scrapy.Field()类型,scrapy.Field()可以接收任何数据类型。
现在该定制我们的爬虫了。
在spiders 文件夹下建立一个AppScrapy.py,然后打开添加如下代码
from scrapy.spider import BaseSpider
from appScrapy.items import AppscrapyItem
class AppScrapy(BaseSpider):
name = ‘app_scrapy‘
start_urls = ["https://itunes.apple.com/cn/genre/ios-yu-le/id6016?mt=8"]
def parse(self, response):
result = []
lis = response.xpath("//div[@class=‘grid3-column‘]/div")
for li in lis:
array = li.xpath("./ul/li")
for node in array:
item = AppscrapyItem()
item["name"] = node.xpath("./a/text()").extract()
item["url"] = node.xpath("./a/@href").extract()
result.append(item)
return result
所有爬虫类都需要继承自 BaseSpider,并且必须定义一个name,因为启动爬虫时我们要靠这个名字来启动。一个url的数组,必须的这个爬虫才能知道自己应该去哪,最后必须实现parse方法,在这里对爬回来的数据真行筛选得到我们想要的。
当我们启动这个爬虫时 (scrapy crawl app_scrapy
),scrapy会从start_urls中取出第一条url,并且用这个url发起一个request,并且把parse作为该request的回调函数,在回调函数中的response就是该request请求后得到的响应。
对于内容的选取我们用xpath方法,xpath方法中要求输入一个路径返回一个selector数组。
对于路径我们可以使用Chrome的开发者工具得到,如上图所示。 我们想要获取内容时,只要在Element选项卡下选中内容,然后右键选择 copy xPath
lis = response.xpath("//div[@class=‘grid3-column‘]/div")
首先我们利用xpath获得 class = ‘grid3-column’的div 中所有的div,返回的值一个数组。从上面的图片中我们可以看数组中应该是3个表示div 的selector.
每个div中的内容如上图所示。我们取出每一个div对其内容再解析。
for li in lis:
array = li.xpath("./ul/li")
for node in array:
item = AppscrapyItem()
item["name"] = node.xpath("./a/text()").extract()
item["url"] = node.xpath("./a/@href").extract()
result.append(item)
首先用for 循环取出每一个div,然后在当前的div下获取所有的ul下的所有li,所上图所示,我们会得到一个表示li的selector数组。我们再看一下li的结构
中间的文字我们通过text()来获得,所以当前li的文字路径为”./a/text()” “.”表示当前的selector开始。如果这样返回,xpath返回的是一个selector.我们想要获取其真正的值还需要调用extract(),这样就会返回一个其真实字面值的数组。
要想获取字段的属性值,需要使用 @,如上面的@href,然后把这些值赋给我们写好的item就ok了。
数据当然要把保存了,未完待续,下次写怎么保存到数据库。
原文地址:http://blog.csdn.net/barryclass/article/details/44178071