1. 创建项目
在命令行中:scrapy startproject baidu(项目名称)
2. 项目文件目录
3. items文件
Field对象指明了每个字段的元数据(metadata)。
爬取的主要目标就是从非结构性的数据源提取结构性数据。
import scrapy
class BaiduItem(scrapy.Item):
# define the fields for your item here like:
content = scrapy.Field()
# url=scrapy.Field()
4.pipelines 文件
将数据存储到mongodb中,在settings中设置好后,需要引入这个文件中,以保存在mongodb中。
import pymongo
from scrapy.conf import settings
classBaiduPipeline(object):
def__init__(self):
# 链接数据库
self.client = pymongo.MongoClient(host=settings['MONGO_HOST'],port=settings['MONGO_PORT'])
# 数据库登录需要帐号密码的话
# self.client.admin.authenticate(settings['MINGO_USER'], settings['MONGO_PSW'])
self.db =self.client[settings['MONGO_DB']]# 获得数据库的句柄
self.coll =self.db[settings['MONGO_COLL']]# 获得collection的句柄
defprocess_item(self, item,spider):
postItem =dict(item)# 把item转化成字典形式
self.coll.insert(postItem)# 向数据库插入一条记录
return item# 会在控制台输出原item数据,可以选择不写
5.spider爬虫主文件
主要为获取网页数据,分析网页结构,利用Xpath定位数据。
from scrapy.spiders import Spider
from scrapy.selector import Selector
from scrapy import Request
from baidu.items import BaiduItem# 如果报错是pyCharm对目录理解错误的原因,不影响
import scrapy
classHeartsongSpider(Spider):
name ="baidu"
allowed_domains = ["chuanke.com"]# 允许爬取的域名,非此域名的网页不会爬取
ruls ="http://www.chuanke.com/?mod=course&act=show&do=comment&sid=4509752&courseid=136902&appraise=0&comment_flag=0&page=1"
start_urls = [
# 起始url,这里设置为从最大tid开始,向0的方向迭代
ruls
]
# 用来保持登录状态,可把chrome上拷贝下来的字符串形式cookie转化成字典形式,粘贴到此处
cookies = {}
# 发送给服务器的http头信息,有的网站需要伪装出浏览器头进行爬取,有的则不需要
headers = {
# 'Connection': 'keep - alive',
'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36'
}
# 对请求的返回进行处理的配置
meta = {
'dont_redirect':True,# 禁止网页重定向
'handle_httpstatus_list': [301,302]# 对哪些异常返回进行处理
}
defparse(self, response):
selector = Selector(response)# 创建选择器
table = selector.xpath('//*[@class="info"]')# 取出所有的楼层
item = BaiduItem()# 实例化一个item
foreachintable:
# 通过XPath匹配信息,注意extract()方法返回的是一个list
item['content'] = each.xpath('//*[@class="info"]/text()').extract()
# 处理下一页问题
next_page = response.xpath('//*[@class="next ajaxLink"]/@href').extract_first()
ifnext_pageis not None:
next_page = response.urljoin(next_page)
yieldscrapy.Request(next_page,callback=self.parse)
yielditem# 将创建并赋值好的Item对象传递到PipeLine当中进行处理
6.settings文件
BOT_NAME ='baidu'
SPIDER_MODULES = ['baidu.spiders']
NEWSPIDER_MODULE ='baidu.spiders'
ROBOTSTXT_OBEY =False
ITEM_PIPELINES = {
'baidu.pipelines.BaiduPipeline':300,
}
#在settings中设置连接mongodb的设置
MONGO_HOST ="localhost"# 数据库主机IP
MONGO_PORT =27017# 端口号
MONGO_DB ="baiduSpider"# 数据库名
MONGO_COLL ="baidu"# collection名
7.运行项目
现将mongodb数据库打开
在Robomongo可视化软件中创建连接
运行scrapy项目:在命令行中输入scrapy crawl baidu(爬虫文件中的name)
参考文章http://blog.csdn.net/u012150179/article/details/34486677scrapy
多级url爬取