1、强烈推荐的Scrapy框架教程:http://blog.csdn.net/column/details/younghz-scrapy.html
2、框架说明:
2.1:
整理框架中,初学者只需要参与的就是Spiders和item Pipeline模块
各模块的作用:
Spider 模块:解析网页和发送url请求。
Item模块:定义保存数据的格式,以字典存储,可以定义N个字段
Pipeline模块:定义解析后的数据写到文件中
下面具体例子进行说明:
代码是借用博客: http://blog.csdn.net/u012150179/article/details/34486677
Spider模块中,我们必须要解析数据,和发送新的URL请求,当然,新的URL也是解析网页得到的。
#!/usr/bin/python # -*- coding:utf-8 -*- # from scrapy.contrib.spiders import CrawlSpider,Rule from scrapy.spider import Spider from scrapy.http import Request from scrapy.selector import Selector from CSDNBlog.items import CsdnblogItem class CSDNBlogSpider(Spider): """爬虫CSDNBlogSpider""" name = "CSDNBlog" #减慢爬取速度 为1s download_delay = 1 allowed_domains = ["blog.csdn.net"] start_urls = [ #第一篇文章地址 "http://blog.csdn.net/u012150179/article/details/11749017" ] def parse(self, response): sel = Selector(response) #items = [] #获得文章url和标题 item = CsdnblogItem() article_url = str(response.url) article_name = sel.xpath('//div[@id="article_details"]/div/h1/span/a/text()').extract() item['article_name'] = [n.encode('utf-8') for n in article_name] item['article_url'] = article_url.encode('utf-8') yield item #获得下一篇文章的url urls = sel.xpath('//li[@class="next_article"]/a/@href').extract() for url in urls: print url url = "http://blog.csdn.net" + url print url yield Request(url, callback=self.parse)
def parse(self, response)
1、response就是整个scrapy框架中,控制中心将请求发送给下载器,下载器下载了整个网页后,由控制中心将结果(Response)回送给spider解析,(spider解析网页的功能就在这里体现)。当然,在Response这个结果中,可以解析出我们需要再访问的url,然后继续发送URL请求,可以通过Request请求完成。
2、在parse中,我们只要解析出我们需要的数据,然后yield item ,就可以得到我们的数据,至于数据格式就看你们item的定义,数据存成哪种编码,哪个文件,就看pipeline。
3、然后把response中包含你想继续访问的URL解析出来,发送请求,至于调度器如何调度,下载器下载,调度器再把结果返回等一系列过程,就无需我们干预,这就是框架的作用,我们只要填函数就可以了。
iitem :定义每条记录的字段
# -*- coding:utf-8 -*- from scrapy.item import Item, Field class CsdnblogItem(Item): """存储提取信息数据结构""" article_name = Field() article_url = Field()
import json import codecs class CsdnblogPipeline(object): def __init__(self): self.file = codecs.open('CSDNBlog_data.json', mode='wb', encoding='utf-8') def process_item(self, item, spider): line = json.dumps(dict(item)) + '\n' self.file.write(line.decode("unicode_escape")) return item