前言序锦
为了做比赛,需要从网上爬取数据,所以自己不得不从零基础开始学爬虫,当自己学着从网上爬取一本小说,从网上爬取自己想要的数据后,一步步掌握了爬虫的机理后,开始想着如何去实现爬取一个网站:
- 首先我们需要了解爬虫的简单框架:
- 爬虫调度端:启动爬虫,停止爬虫,监视爬虫运行情况;
- URL管理器:将要爬取的和已经爬取的URL进行管理;可取出待爬取的URL,将其传送给“网页下载器”
- 网页下载器:将URL指定的网页下载,存储成一个字符串,再传送给“网页解析器”
- 网页解析器:解析网页可解析出(1)有价值的数据(2)另一方面,每个网页都包含有指定其他网页的URL,解析出来后可以补充进“URL管理器”
清楚了整个流程之后,我就在想,抓取一个网站我们是不是应该可以用一个框架来实现上面分析的所有的模块,因为比如说我想抓取很多网站的时候,这个时候就特别麻烦,你要为每一个你要爬取的网站编写一个爬虫,相当于每次编写爬虫都在搭建一个框架,这样显然效率不高,但是前辈们早已为我们搭好了这个框架,只需要我们耐心的找到,并认真学习领会这个框架-“scrapy”
开始进入正题:
- 安装scrapy
- 创建第一个scrapy项目
- 定义你需要的Items
- 编写存储文件Pipelines将数据保存到txt文件中
- 编写爬写网站的Spider
- 设置setting文件
- 爬取结果
0
- 安装scrapy
- 我的电脑是win10版本,所以这里主要指在windows上进行安装,其他版本上请自行搜索。
- 下载Python3.6.4,可以在官网下载,这里提供免费提供一个
- 安装python3.6.4,安装的时候需要记住,下面有一个add to path(就是自动加入环境变量,不需要我们人为的再像2.7一样去配置环境变量了)
- 查看版本:python –version
- 安装pywin32,可以从官网下载,这里免费提供一个pywin32-221.win-amd64-py3.6.exe(64位电脑的,因为博主的电脑是64位的,32位的你们可以自己另外下载)。(安装过程中出错的话,可以去看一下这篇文章 Python3.5中安装Scrapy)
- 安装pywin32之后,然后打开命令行,确认pip是否被正确安装,输入pip –version,其实python2.7.9之后,默认是安装了pip;如果没有安装pip,可以百度。博主是使用的3.6.4,所以默认安装pip,你可以选择更新pip版本。
- 安装了pip,使用pip安装scrapy,输入命令:pip install Scrapy。安装了Scrapy,然后就可以开始新建Scrapy项目了。
- 创建第一个scrapy项目
- 在开始爬取之前,您必须创建一个新的Scrapy项目。进入您打算存储代码的目录中,运行新建命令。例如,我需要在E:\Code Repository\ReptilesCode目录下存放该项目,打开命令窗口,进入该目录,执行以下命令:
scrapy startproject xminghua
PS:tutorial可以替换成任何你喜欢的名称,最好是英文
该命令将会创建包含下列内容的 xminghua目录:
- 在开始爬取之前,您必须创建一个新的Scrapy项目。进入您打算存储代码的目录中,运行新建命令。例如,我需要在E:\Code Repository\ReptilesCode目录下存放该项目,打开命令窗口,进入该目录,执行以下命令:
xminghua/
scrapy.cfg
xminghua/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
这些文件分别是:
scrapy.cfg: 项目的配置文件
xminghua/: 该项目的python模块。之后您将在此加入代码。
xminghua/items.py: 项目中的item文件.
xminghua/pipelines.py: 项目中的pipelines文件.
xminghua/settings.py: 项目的设置文件.
xminghua/spiders/: 放置spider代码的目录
定义你想要的Items
Item 是保存爬取到的数据的容器;其使用方法和python字典类似,并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。我们需要从想要爬取的网站(这里爬取我的个人网站http://www.xminghua.cn)中获取以下属性:
# 网站标题
# 网站类型
# 网站描述
# 网站文章
# 文章名称
# 文章发布时间
# 文章内容
对此,在item中定义相应的字段。编辑xminghua目录中的 items.py 文件:
class XminghuaItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
web_title = scrapy.Field()
# 网站标题
web_type = scrapy.Field()
# 网站类型
web_url = scrapy.Field()
# 网站地址
web_description = scrapy.Field()
# 网站描述
# web_article = scrapy.Field()
# 网站文章
article_names = scrapy.Field()
# 文章名称
article_releasetime = scrapy.Field()
# 文章发布时间
article = scrapy.Field()
# 文章内容
- 编写存储文件Pipelines将数据保存到txt文件中
- 编写代码将获取的数据以txt的形式存入到文件中
- 代码如下:
class XminghuaPipeline(object):
def process_item(self, item, spider):
fp = codecs.open('xuminghua.txt', 'w', 'utf-8')
fp.write(u"网站标题:" + item['web_title'])
fp.write(u"\r\n网站类型:" + item['web_type'])
fp.write(u"\r\n网站地址:" + item['web_url'])
fp.write(u"\r\n网站描述:")
fp.writelines(item['web_description'])
fp.write(u"\r\n网站文章:" + u"\r\n文章名称:" + item['article_names'] + u"\r\n文章发布时间:" + item['article_releasetime'])
fp.write(u"\r\n文章内容:")
fp.writelines(item['article'])
fp.close()
return item
- 编写爬写网站的Spider
- Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。
- 1、xminghua.py文件:
- 包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容,提取生成 item 的方法。为了创建一个Spider,您必须继承 scrapy.Spider 类,且定义以下三个属性:
- name:用于区别Spider。该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。
- start_urls:包含了Spider在启动时进行爬取的url列表。因此,第一个被获取到的页面将是其中之一。后续的URL则从初始的URL获取到的数据中提取。
- parse() 是spider的一个方法。被调用时,每个初始URL完成下载后生成的Response 对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据(response data),我这里直接从一个子链进行提取数据并返回,没有进行二级子链的提取,大家需要看的话,可以从这篇文章里面去看,代码里面是重点:Scrapy教程——搭建环境、创建项目、爬取内容、保存文件(txt)
- 以下是xuminghua.py的全部代码:
# -*- coding: utf-8 -*-
import scrapy
from scrapy import Selector
from xminghua.items import XminghuaItem
class XuminghuaSpider(scrapy.Spider):
name = 'xuminghua'
allowed_domains = ['www.xminghua.cn']
start_urls = ['http://www.xminghua.cn/2017/03/%E5%91%A8%E6%9C%AB%E6%84%89%E5%BF%AB/']
def parse(self, response):
Item = XminghuaItem()
sel = Selector(response)
Item['web_title'] = sel.xpath('//h1[@class="panel-cover__title panel-title"]/a/text()').extract()[0]
Item['web_type'] = sel.xpath('//span[@class="panel-cover__subtitle panel-subtitle"]/text()')[0].extract()
Item['web_url'] = response.url[0:23]
# description1 = sel.xpath('//div[@class="info-back"]/h2/text()').extract()
# description12 = sel.xpath('//div[@class="info-back"]/p/text()').extract()
Item['web_description'] = sel.xpath('//div[@class="info-back"]//text()').extract()
Item['article_names'] = sel.xpath('//h1[@class="post-title"]/text()').extract()[0]
Item['article_releasetime'] = sel.xpath('//time[@class="post-meta__date date"]/text()').extract()[0]
Item['article'] = sel.xpath('//section[@class="post"]//text()').extract()
yield Item
注意:这里的yield一定不能写成return,return表示结束并返回数据,而我们是需要将数据返回到pipelines,然后写入到文件
- 设置setting文件
- USER_AGENT = ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36’
- ITEM_PIPELINES = {
‘xminghua.pipelines.XminghuaPipeline’: 300,
} - 如果需要日志输出文件,可以设置LOG_LEVEL和LOG_FILE,具体的可以自己去搜索一下如何设置,我这里设置的是
- LOG_LEVEL = ‘WARNING’
- LOG_FILE = ‘xminghua_log.txt’
- 爬取结果
- 运行爬虫,在爬虫文件所在文件件(xuminghua.py所在文件夹),打开命令行,输入scrapy crawl xuminghua(xuminghua.py文件中的name所定义的名字,唯一不可替代)
- 查看结果:
- xuminghua.txt展示
所以还不知道如何爬取网站以及如何快速简便使用scrapy框架的童鞋们,快快看过来……
PS:这一个月忙着赶比赛,所以更新的周期频率可能没有之前那么快,希望小伙伴们见谅哈^-^