scrapy
功能很强大,但我学习的是入门级别的
http://docs.pythontab.com/scrapy/scrapy0.24/topics/selectors.html中文官方文档
http://blog.csdn.net/qq_30242609/article/details/52810840 参考博客教程
http://blog.csdn.net/column/details/younghz-scrapy.html 参考博客教程(比较有深度)
安装过程比较麻烦。。。因为此包是比较高级的包,它是在很多包的基础之上工作的
安装过程参考http://cuiqingcai.com/1052.html
下面是scrapy的工作原理
这是实例解释
在命令提示符下创建scrapy项目之后自动生成1-4文件
这里以我写的爬贴吧贴子为例,但是有个未解决问题,这里爬下来的每个页面之间是们没有顺序的。。。
1 是写爬虫的
2是写数据的
类型于这样,定义想要获取的内容
class StiebaItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
comment=scrapy.Field()
name=scrapy.Field()
但是我写的爬虫里面并没有调用它。。。因为我只需要评论直接写入文件就好了
3是处理获得数据的
类型于这样。。。也可以写入数据库什么的。。我同样没有用到
def process_item(self, item, spider):
file = open("item.txt", "a") # 以追加的方式打开文件,不存在则创建
item_string = str(item).decode("unicode_escape").encode('utf-8')
file.write(item_string)
file.write('\n')
file.close()
4是写入固定不变的配置的,例如Header,并且添加才能用pipelines文件
ITEM_PIPELINES = {'stieba.pipelines.StiebaPipeline': 300}
5是我添加的,加入一行代码,替换掉在命令行内启动,运行时直接选择这个文件就行了
from scrapy import cmdline
cmdline.execute("scrapy crawl sstieba".split())
以下是我第一个用scrapy写的小代码
在spiders文件夹下添加tieba_spider.py文件
#coding=utf-8
from scrapy.spider import Spider
from scrapy.selector import Selector
from scrapy import Request
from stieba.items import StiebaItem
import re
class TiebaSpider(Spider):
name = 'sstieba'#执行命令的时候的爬虫的名字
allowed_domains=['tieba.baidu.com']#限制访问的域名,可以多个
start_urls=['http://tieba.baidu.com/f?kw=%E7%9F%B3%E5%AE%B6%E5%BA%84%E5%B8%82%E7%9F%BF%E5%8C%BA%E4%B8%AD%E5%AD%A6&fr=index']#开始的地址
def start_requests(self):#这是重写的方法 不需要手动调用
print 'kaishi'
yield Request(self.start_urls[0],callback=self.aparse,)#多线程,请求
def aparse(self, response):
print 'pachong'
selector = Selector(response)
print selector,'zheli'
tiezi_urls=selector.xpath('//div[@class="threadlist_title pull_left j_th_tit "]/a/@href')
tieba_page=selector.xpath('//span[@class="pagination-current pagination-item "]/following-sibling::a[1]/@href').extract()
print tieba_page,'xiayiye'
print tiezi_urls
for tiezi_url in tiezi_urls:
url='http://tieba.baidu.com'+str(tiezi_url.extract())
print '贴吧地址',url
yield Request(url,callback=self.page)
if tieba_page[0]:
yield Request(tieba_page[0], callback=self.aparse)
print 'tiebaxiayiye',tieba_page[0]
def page(self,response):
selector = Selector(response)
item = StiebaItem()#没用上 也可以用这里来处理所得的内容
name = selector.xpath('//h1[@class="core_title_txt "]/@title').extract()[0]
od = open('item.txt', 'a')
od.write(name.encode('utf-8')+'\n')
page=selector.xpath('//span[@class="red"]/text()').extract()[1].encode('utf-8')
print response.url,page
for i in range(1,int(page)+1):
yield Request(response.url+'?pn='+str(i),callback=self.tiezi_parse)
def tiezi_parse(self,response):
selector=Selector(response)
od = open('item.txt', 'a')
pilus=selector.xpath('//div[@class="d_post_content j_d_post_content clearfix"]').extract()
for pilu in pilus:
pilua=pilu.encode('utf-8')
reg=re.compile('arfix"> (.*)</div>')
pilub=re.findall(reg,pilua)
pasl=re.sub(r'<br>', '',pilub[0])
print pasl
od.write(pasl+'\n')
其实其他文件不用做改动就能运行了。。。
在我的理解scrapy与我之前学习的大跃进就是创建工程了,不再是单个文件实现各种功能了
还有就是速度比bs快的多,因为它是多线程的,资源使用率提高很多速度就变快了
其它的优势还有很多,不过由于我学的太浅了,还没有体会出来