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()
pipeline:定义结果存在哪里,存成哪种编码
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