使用Scrapy进行爬取数据

1.创建爬虫weather

scrapy  startproject   weather
这条命令会产生如下的文件夹以及文件
weather.
├── scrapy.cfg
└── weather
    ├── __init__.py
    ├── items.py
    ├── pipelines.py
    ├── settings.py
    └── spiders
        └── __init__.py
weather/文件下有如下:
  scrapy.cfg    : 项目配置文件
  weather/      : 项目python模块, 之后您将在此加入代码
    items.py    : 项目items文件
    pipelines.py: 项目管道文件
    settings.py : 项目配置文件
    spiders/    : 放置spider的目录
项目根目录==在项目的scrapy.cfg文件同级目录

2、编写必要的组件

明确目标(Items):明确你想要抓取的目标
制作爬虫(Spider):制作爬虫开始爬取网页
存储内容(Pipeline):设计管道存储爬取内容

  <1>. item 可以用 scrapy.item.Item 类来创建,并且用 scrapy.item.Field 对象来定义属性(可以理解成类似于 ORM 的映射关系)。
    接下来,我们开始来构建 item 模型(model)。
    首先,我们想要的内容有:
        名称(name)
        链接(url)
        描述(description)
    修改 weather 目录下的 items.py 文件,在原本的 class 后面添加我们自己的 clas
  <2>.制作爬虫(Spider)
    制作爬虫,总体分两步:先爬再取。
    也就是说,首先你要获取整个网页的所有内容,然后再取出其中对你有用的部分。
        爬
          Spider 是用户自己编写的类,用来从一个域(或域组)中抓取信息。 他们定义了用于下载的 URL 列表、跟踪链接的方案、解析网页内容的方式,以此来提取 items。 要建立一个 Spider,你必须用 scrapy.spider.BaseSpider 创建一个子类,并确定三个强制的属性:
            name:爬虫的识别名称,必须是唯一的,在不同的爬虫中你必须定义不同的名字。
            start_urls:爬取的 URL 列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些 urls 开始。其他子 URL 将会从这些起始 URL 中继承性生成。
            parse():解析的方法,调用的时候传入从每一个 URL 传回的 Response 对象作为唯一参数,负责解析并匹配抓取的数据(解析为 item),跟踪更多的 URL。
        取
          爬取整个网页完毕,接下来的就是的取过程了。光存储一整个网页还是不够用的。在基础的爬虫里,这一步可以用正则表达式来抓。
          在 Scrapy 里,使用一种叫做 XPath selectors 的机制,它基于 XPath 表达式。 
  <3>.存储内容(Pipeline)
    保存信息的最简单的方法是通过 Feed exports,主要有四种:JSON,JSON lines,CSV,XML。 我们将结果用最常用的 JSON 导出
    写好ITEM_PIPELINES后,还有很重要的一步,就是把 ITEM_PIPELINES 添加到设置文件 settings.py 中。

3、运行爬虫

到项目根目录, 然后运行命令
cd  weather  
运行命令
scrapy  crawl

4.示例

items.py

# -*- coding: utf-8 -*-
import scrapy
class WeatherItem(scrapy.Item):
city = scrapy.Field()
date = scrapy.Field()
dayDesc = scrapy.Field()
dayTemp = scrapy.Field()

pipelines.py

# -*- coding: utf-8 -*-
class WeatherPipeline(object):
def __init__(self):
    pass

def process_item(self, item, spider):
    with open('wea.txt', 'w+') as file:
        city = item['city'][0].encode('utf-8')
        file.write('city:' + str(city) + '\n\n')

        date = item['date']

        desc = item['dayDesc']
        dayDesc = desc[1::2]
        nightDesc = desc[0::2]



        weaitem = zip(date, dayDesc, nightDesc)

        for i in range(len(weaitem)):
            item = weaitem[i]
            d = item[0]
            dd = item[1]
            nd = item[2]
            txt = 'date:{0}\t\tday:{1}({2})\t\t'.format(
                d,
                dd.encode('utf-8'),
                nd.encode('utf-8')
            )
            file.write(txt)
    return item

settings.py

# -*- coding: utf-8 -*-
BOT_NAME = 'Googlebot'
SPIDER_MODULES = ['weather.spiders']
NEWSPIDER_MODULE = 'weather.spiders'
USER_AGENT = 'User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36'
DEFAULT_REQUEST_HEADERS = {
    'Referer': 'http://www.weibo.com'
}
ITEM_PIPELINES = {
    'weather.pipelines.WeatherPipeline': 1
}
DOWNLOAD_DELAY = 0.5

spider

# -*- coding: utf-8 -*-
import scrapy
from bs4 import BeautifulSoup
from weather.items import WeatherItem

class WeatherSpider(scrapy.Spider):
name = "myweather"
allowed_domains = ["sina.com.cn"]
start_urls = ['http://weather.sina.com.cn']

def parse(self, response):
    html_doc = response.body
    #html_doc = html_doc.decode('utf-8')
    soup = BeautifulSoup(html_doc)
    itemTemp = {}
    itemTemp['city'] = soup.find(id='slider_ct_name')
    tenDay = soup.find(id='blk_fc_c0_scroll')
    itemTemp['date'] = tenDay.findAll("p", {"class": 'wt_fc_c0_i_date'})
    itemTemp['dayDesc'] = tenDay.findAll("img", {"class": 'icons0_wt'})
    itemTemp['dayTemp'] = tenDay.findAll('p', {"class": 'wt_fc_c0_i_temp'})
    item = WeatherItem()
    for att in itemTemp:
        item[att] = []
        if att == 'city':
            item[att] = itemTemp.get(att).text
            continue
        for obj in itemTemp.get(att):
            if att == 'dayDesc':
                item[att].append(obj['title'])
            else:
                item[att].append(obj.text)
    return item

启动爬虫

scrapy crawl  weather

4.注意事项

明确目标:
    对目标网站的规模和结构进行了解
            对网站进行背景调查--
                估算网站大小,识别网站使用的技术。
    对爬取的数据进行了解--
            URL格式<路径规划--确定解析规则>
            数据格式<确定提取格式>
            其他<Encoding等>
爬虫设定
    其中时间设定很重要,因为很多网站都对其进行了设定
    过快则可能被禁,甚至IP遭到封杀。调试的时候注意
阶段:
    多个网页
    动态网页爬取--JavaScript
    表单交互--和网页进行交互--登陆网站
    验证码处理
    并发下载--多线程和多进程网页下载
    缓存

blogroll

social