一.安装python环境
网上教程查阅
安装成功后运行:python
查看版本:python-V
二.安装pycharm
应在步骤一完成后进行
到pycharm官网下载最新版本
下载链接:https://www.jetbrains.com/pycharm/
三.创建Scrapy项目
1.Scrapy的安装
Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本又提供了web2.0爬虫的支持。
由于Scrapy框架不是Python的标准模块,因此我们需要先安装Scrapy
使用命令:
pipinstall scrapy
安装中若报错的话根据相应提示进行缺少模块的安装与更新即可
注:若显示部分模块已存在但版本过低的情况,只需执行:
pipuninstall 模块名称 //删除已有模块
pipinstall 模块名称 //安装模块-安装最新版本
来尝试解决问题
2.Scrapy项目的创建
2.1scrapy项目创建语法
scrapystartproject 工程名称
2.2Spider爬虫创建语法
scrapygenspider 爬虫程序名称 访问的域名
进入到爬虫项目文件夹
到这里,我们的Scrapy项目文件创建完成
使用pycharm工具打开我们刚才创建的weatherSpider项目,可看到它的目录文件如下:
Scrapy项目下的常用文件说明:
scrapy.cfg:该文件为Scrapy项目的核心配置文件,设置项目默认配置文件路径名称以及项目发布名称等信息
items.py:该文件的作用是设置网络采集的每条数据的共同属性,它就是一个实体自定义模块,用于定义每条采集数据的属性
pipelines.py:该文件的作用是将爬虫每次爬取到单位信息进行后续处理,比如写入到txt文件或将采集到的数据添加到数据库等,根据不同的存储方式,则需要创建不同的pipelines.py文件进行相关处理操作
settings.py:该文件的作用是整个项目的配置驱动文件,我们自定义的piplines.py则需要在该文件中进行配置才可以正常使用,否则项目不进行后续数据处理
spiders:一个文件夹,我们爬虫项目文件会自动生成在该文件夹中
四.数据的爬取
步骤:
1.在item.py实体类文件中定义我们要爬取的数据
2.爬虫主程序weatherspider.py实现
3.获取到的数据的处理(控制台,文本,json,mysql数据库)
4.setting.py文件配置
5.运行项目查看结果
执行命令:scrapycrawl weatherspider
1.在item.py实体类文件中定义我们要爬取的数据
这时需要导入scrapy下的item.py文件中的Item类和Filed类
import scrapy
from scrapy.item import Item,Field
class WeatherspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
#日期
date=scrapy.Field()
#天气状况
wea=scrapy.Field()
#最高温度
temp_max=scrapy.Field()
#最低温度
temp_min=scrapy.Field()
pass
2.爬虫主程序weatherspider.py实现
在这里面我们需要更改的只有status_urls去指定我们需要数据的具体网页
其次是重写这个类中的parse方法:来获取我们需要的数据
import sys
import scrapy
from weatherSpider.items import WeatherspiderItem
default_encoding='utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
class WeatherspiderSpider(scrapy.Spider):
name = 'weatherspider'
allowed_domains = ['www.weather.com.cn']
start_urls = ['http://www.weather.com.cn/weather/101100101.shtml']
def parse(self, response):
current_item=response.xpath('//div[@class="c7d"]/ul/li')
#获取当前页面中的天气信息标签并生成一个列表
weather = WeatherspiderItem()
weather['date'] = current_item.xpath('h1/text()').extract()
weather['wea'] = current_item.xpath('p[@class="wea"]/text()').extract()
weather['temp_max'] = current_item.xpath('p[@class="tem"]/span/text()').extract()
weather['temp_min'] = current_item.xpath('p[@class="tem"]/i/text()').extract()
yield weather
pass
3.获取到的数据的处理
3.1在控制台输出
def process_item(self, item, spider):
for i in range(7):
print u'日期:', item['date'][i]
print u'天气状况:', item['wea'][i]
print u'最高温度:', item['temp_max'][i]
print u'最低温度:', item['temp_min'][i]
return item
3.2将数据写入txt文本
import os
import time
class WeatherspiderPipeline(object):
def __init__(self):
#创建文件夹
self.folder_name='output'
if not os.path.exists(self.folder_name):
os.mkdir(self.folder_name)
pass
def process_item(self, item, spider):
currentTime=time.strftime("%Y-%m-%d",time.localtime())
fileName='weather-7'+currentTime+'.txt'
try:
with open(self.folder_name+'/'+fileName,'a') as fp:
for i in range(7):
fp.write(u'日期:' + item['date'][i])
fp.write(u'天气状况:' + item['wea'][i])
fp.write(u'最低温度:' + item['temp_min'][i] + '\n')
pass
except EOFError as er:
print er
pass
finally:
fp.close()
pass
return item
3.3将数据写成json形式
class WeatherspiderPipeline(object):
def __init__(self):
#创建文件夹
self.folder_name='output'
if not os.path.exists(self.folder_name):
os.mkdir(self.folder_name)
pass
def process_item(self, item, spider):
currentTime=time.strftime("%Y-%m-%d",time.localtime())
fileName='weather-7'+currentTime+'.json'
try:
with codecs.open(self.folder_name+'/'+fileName,'a') as fp:
jsonLine=json.dumps(dict(item),ensure_ascii=False)+'\n'
fp.write(jsonLine)
with open(self.folder_name+'/'+fileName,'a') as fp:
pass
except EOFError as er:
print er
pass
finally:
fp.close()
pass
return item
3.4将数据写入mysql数据库
#MySQLdb需要下载安装
import MySQLdb
class WeatherspiderPipeline(object):
def process_item(self, item, spider):
conn=MySQLdb.connect(host='localhost',user='root',passwd='***',db='lv',port=3306)
conn.begin()#开始事物
conn.set_character_set('utf8')
#得到游标对象
c=conn.cursor()
c.execute('SET NAMES utf8')
c.execute('SET CHARACTER SET utf8')
c.execute('SET character_set_connection=utf8 ')
#执行SQL语句
for i in range(7):
date=item['date'][i]
wea=item['wea'][i]
temp_max=item['temp_max'][i]
temp_min=item['temp_min'][i]
sql='INSERT INTO weather VALUES(%s,%s,%s,%s)'
c.execute(sql,(date,wea,temp_max,temp_min))
conn.commit() #提交事物
print '----------------'
return item
4.settind.py文件配置
该文件的作用是整个项目的配置驱动文件,我们自定义的piplines.py则需要在该文件中进行配置才可以正常使用,否则项目不进行后续数据处理
ITEM_PIPELINES = {
# 'weatherSpider.pipelines.WeatherspiderPipeline': 300,
# 'weatherSpider.pipelines2txt.WeatherspiderPipeline': 1,
'weatherSpider.pipelines2json.WeatherspiderPipeline': 1,
'weatherSpider.pipelines2mysql.WeatherspiderPipeline': 1,
}
# 配置动态代理模块
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware' : None,
'weatherSpider.rotate_useragent.RotateUserAgentMiddleware' :400}
5.运行项目查看结果
执行命令:scrapycrawl weatherspider
控制台
mysql数据库