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