Python scrapy 安装和网页爬虫功能实现

现在组内有个工作就是维护恶意URL库,然后这个维护工作,主要是通过从几个会发布恶意URL地址的网站获取恶意网址,每次都得花费半天,很乏味的事情。所以就想到能否用个爬虫搞定。
这两天研究了下python scrapy,发现利用scrapy的确很容易实现网址爬取功能。

一、scrapy安装

简单的说明一下scrapy的安装过程

  • window安装
    先安装python,要提醒一下是环境变量的配置,只有环境变量配置对了,才能在命令行执行窗口找到python相关的命令。

我这里安装的是3.4.3版本,可以看到,pip自动安装好了。

通过pip安装scrapy


  • Ubuntu下安装
    (1) 安装python,Ubuntu一般都是自带python的。只要python版本是2.7以上就可以
****@****-Vostro-270s:/home/saplingcode$ python --version
Python 2.7.6

(2) 安装python-pip,安装这个的目的是通过pip来安装scrapy。

(3) 安装scrapy

二、爬虫代码实现

先用scrapy 创建一个工程

工程的目录结构如下,后面再详细讲解一下,每个文件作用。

scrapy 中的item、spider、pipeline

从上面创建项目产生的文件中可以看到,项目中主要包括三类功能模块item、spider、pipeline,下面先对着三个文件的作用简要说明一下。

Item
Item 主要用来定义是保存爬取到的数据的容器;定义要保存数据的字段,该类必须继承scrapy.Item 类, 并且用 scrapy.Field 的类属性来定义一个Item。 如果还不清楚下面会用具体的例子说明。

Spider

Spider 是用于实现爬取页面主要功能,在该类中确定爬取哪些页面,页面爬取下来后,怎样获取需要爬取的内容。把爬取的内容保存到前面写的Item中。

首先该类必须继承 scrapy.Spider 类, 且需要定义以下三个属性:
name: 用于区别Spider。 该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。Scrapy 通过该名字区分不同的爬虫。
start_urls: 包含了Spider在启动时进行爬取的url列表。 因此,第一个被获取到的页面将是其中之一。 后续的URL则从初始的URL获取到的数据中提取。
parse():必须重载spider的这个方法。 被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。 该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。

pipeline
通过该模块可以实现一些过来功能,通过该模块可以实现对提取的数据(生成的Item)进一步处理,如过滤某些满足特定条件的item,改变生成数据的字符编码等。


下面以实现爬取www.sogou321.com所有导航链接为例子演示一下


item实现
这里只爬取各个导航的链接和对应的网站名称,所以item中只需要定义两个字段来保存对应的内容,这里分别为url、site_name,名字可以随便取。

# -*- coding: utf-8 -*-
#define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.htmlimport scrapy
class ScrapyPrjItem(scrapy.Item):# define the fields for your item here like:site_name = scrapy.Field()url = scrapy.Field()

spider实现
在上面创建的项目中,进入spiders目录可以看到除了init.py文件,就没其它文件了,这就需要我们自己创建spider文件了,可以通过如下命令创建,执行该命令后会再spider下自动生成 sogou321.py,可能有人会问能自己手动添加吗,答案是可以的。

/home/scrapy_prj$ scrapy genspider sogou321 sogou321.com

自动生成的代码如下,可以看到该模块是继承scrapy.Spider ,重载了parse()函数

# -*- coding: utf-8 -*-
import scrapyclass Sogou321Spider(scrapy.Spider):name = "sogou321"allowed_domains = ["sogou321.com"]start_urls = ('http://www.sogou321.com/',)def parse(self, response):pass

自己重写parse()函数,我这里把name改成了”sogou”,这不是必须的,只是执行的时候要用修改后的名字。

import scrapy
from scrapy.selector import Selector
from scrapy_prj.items import ScrapyPrjItemclass Sogou321Spider(scrapy.Spider):name = "sogou"  #指定爬虫的名称,必须要唯一allowed_domains = ["www.sogou321.com"] start_urls = ["http://www.sogou321.com/"] #爬虫爬的网址,可以是多个网址#每爬一个网址,都会回调该函数,response为响应数据def parse(self, response): sel = Selector(response)sites = sel.xpath('//ul[@class="sortSite"]/li/em')items=[]for site in sites :item = ScrapyPrjItem()url_local = site.xpath('a/@href').extract()site_name_local = site.xpath('a/text()').extract()item['url'] = [u.encode('utf-8') for u in url_local]item['site_name'] = [site_name_local]  #s.encode('utf-8') for s in site_name_localitems.append(item)return items

这里重点讲解一下parse函数
1、在该函数中,我们必须分析页面返回数据的html格式,只有分析清楚了我们才知道页面什么地方的数据,下面数据是我从响应数据中摘录的一部分。可以看出我们要抓取的数据在标签嵌套关系是ul->li->em->a。
<em><a href="http://tieba.baidu.com/" >百度贴吧</a></em> 标签中的url和站名是需要抓取的信息。

<ul class="sortSite" id="qingtiancms_middle_ul_2">
<li><h4 class="tit fl"><a href="/htmls/luntan/">社 区</a></h4><span class="more fr"><a href="/htmls/luntan/" target="_blank">更多>></a></span>
<em><a  href="http://tieba.baidu.com/" >百度贴吧</a></em>
<em><a  href="http://www.tianya.cn/" >天涯社区</a></em>
<em><a  href="http://www.mop.com/" >猫 扑</a></em>
<em><a  href="http://qzone.qq.com/" >QQ空间</a></em>
<em><a  href="http://www.weibo.com/" style="background: url(template/skin19_4_20100527_1/images/ico/weibo.gif) no-repeat 0;padding-left: 20px;margin-right: -20px;" >新浪微博</a></em>
<em><a  href="http://www.renren.com/" >人人网</a></em>
</li></ul>

2、知道了要抓取的内容在什么地方之后,就需要通过手段提取出需要的内容,这就需要用xpath了。xpath具体的不在详解,自己看看XPath教材,挺简单的。

sites = sel.xpath(‘//ul[@class=”sortSite”]/li/em’), 表示提取ul标签并且标签class属性为sortSite,改标签包含li标签,并且li包含em标签,提取em标签中的内容保存在列表sites中。如下

<ul class="sortSite">
<li>
<em>提取这里的内容
</em>
</li>
</ul>

提取后sites 中的数据如下,下面的数据每一行作为sites list表中的一项。

<a  href="http://tieba.baidu.com/" >百度贴吧</a>
<a  href="http://www.tianya.cn/" >天涯社区</a>
<a  href="http://www.mop.com/" >猫 扑</a>
<a  href="http://qzone.qq.com/" >QQ空间</a>

下面这部分代码是处理上面提取出来保存在sites 列表中的数据,从中提取出链接url和站名(链接文本),保存在item中,最后都会append到items列表中返回。

for site in sites :item = ScrapyPrjItem()#提取链接urlurl_local = site.xpath('a/@href').extract()#提取<a>标签中的文本site_name_local = site.xpath('a/text()').extract()item['url'] = [u.encode('utf-8') for u in url_local]item['site_name'] = [site_name_local]  #s.encode('utf-8') for s in site_name_localitems.append(item)

执行结果

item 和spider都写完了,最基本的爬虫就写完了,执行一下。
执行命令scrapy crawl sogou -o sogou.json,爬虫名字必须是在spider模块中定义的那个name,这例子中是sogou 。爬取结果保存到json文件中

爬取结果如下:


pipeline实现

看一下上面的执行结果,大家可以发现,中文看起来都是乱码,其实是Unicode编码,很难看懂。前面已经讲到,在pipeline模块可以实现对提取到的数据(items数据)进行处理。所以只要保证写文件的时候用utf-8编码,应该就不会出现“乱码”问题了。

要注意,该模块的功能在配置文件中默认是没打开的,需要在配置文件settings.py中加入 ITEM_PIPELINES = {‘scrapy_prj.pipelines.ScrapyPrjPipeline’: 1} ,需要指定到pipelines模块中具体的类。

# -*- coding: utf-8 -*- pipelines.py# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
import json
import codecsclass ScrapyPrjPipeline(object):def __init__(self):  self.file = codecs.open('sogou321.json', 'wb', encoding='utf-8')  def process_item(self, item, spider):  line = json.dumps(dict(item)) + '\n'  self.file.write(line.decode("unicode_escape"))  return item

加入pipelines的执行结果

Python scrapy 实现网页爬虫相关推荐

  1. python网页爬虫循环获取_手把手教你用 Python 搞定网页爬虫

    原标题:手把手教你用 Python 搞定网页爬虫 编译:欧剃 作为数据科学家的第一个任务,就是做网页爬取.那时候,我对使用代码从网站上获取数据这项技术完全一无所知,它偏偏又是最有逻辑性并且最容易获得的 ...

  2. python 写个网页爬虫

    好的,下面是一个简单的 Python 网页爬虫代码示例: import requestsfrom bs4 import BeautifulSoupdef spider(url):response = ...

  3. python urllib dns 缓存_新手用Python做一个网页爬虫

    咱们好哈,最近博主在学习Python,学习时期也遇到一些问题,获得了一些经历,在此将自个的学习体系地整理下来,假如咱们有爱好学习爬虫的话,能够将这些文章作为参阅,也期待咱们总共同享学习经历. 首要py ...

  4. 基于python的批量网页爬虫

    在各个网站,较久远的天气信息基本需要付费购买,因此为了花费更少的代价,得到完整的信息,我们经常会对一个网站进行爬虫,这篇文章是我第一次爬虫的心得,因为是第一次进行爬虫,python程序运行时间较长,若 ...

  5. python scrapy 入门_Python爬虫Scrapy入门看这篇就够了

    一.初窥scrapy scrapy中文文档: http://scrapy-chs.readthedocs.io/zh_CN/latest/ Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应 ...

  6. python笔记—>网页爬虫

    目录 一.了解网页结构 1.网页源代码 1.查看网页源代码以百度为例 2.解读网页源代码 二.requests模块使用方法 1.获取静态网页源代码 2.获取动态加载的数据 1.以豆瓣排行榜为例 2.爬 ...

  7. python 静态网页_Python静态网页爬虫相关知识

    想要开发一个简单的Python爬虫案例,并在Python3以上的环境下运行,那么需要掌握哪些知识才能完成一个简单的Python爬虫呢? 爬虫的架构实现 爬虫包括调度器,管理器,解析器,下载器和输出器. ...

  8. python多线程爬虫实例-python支持多线程的爬虫实例

    python是支持多线程的, 主要是通过thread和threading这两个模块来实现的,本文主要给大家分享python实现多线程网页爬虫 一般来说,使用线程有两种模式, 一种是创建线程要执行的函数 ...

  9. python scrapy的crapy.core.downloader.handlers.http11] WARNING: Received more bytes than download 错误

    python scrapy框架的爬虫遇到下面的错误,一直没查找到解决的办法,请求大佬指教. 在爬取http://firmware.koolshare.cn/网站的时候遇到异常. 2018-10-15 ...

最新文章

  1. window.event.returnValue=false
  2. mysql 日期查询_Mysql日期查询list
  3. 使用FFmpeg实现抽取多媒体文件的音频并按照AAC格式进行保存--附源码
  4. flash跨域访问解决办法
  5. linux python版本升级和系统更新_Linux 下升级python和安装pip
  6. MSP430F5529 DriverLib 库函数学习笔记(九)SPI
  7. shell判定一个变量等于-n_Shell test命令:条件判断,检查某条件是否成立
  8. 两千字揭密 MySQL 8.0.19 三大索引新功能:隐藏索引,降序索引,函数索引
  9. 用74ls90组成二十四进制计数器_CD4017是什么?十进制计数器分频器CD4017的逻辑功能呢?...
  10. mysql xp系统时间_【MySQL】时间函数
  11. 服务器安装数据库显示启动服务,安装数据库没有启动服务器服务
  12. Direct3D11学习:(二)基本绘图概念和基本类型
  13. Miller-rabin判素数
  14. 立创EDA软件专业版 图示入门操作(全)
  15. shp在MATLAB中裁剪数据,ENVI中利用Shape文件裁剪栅格数据
  16. ios 监测网页按钮_关于iOS加载WebView监控网页上的点击事件
  17. NPOI读取Word模板并保存
  18. Unity 回合制战斗
  19. 在线组态工具 html,组态工具-界面组件
  20. html5源码笔记【爱创课堂专业前端培训】

热门文章

  1. 谷歌浏览器查看当前网页默认字体大小及其他样式
  2. python透视变换原理_python cv2中的透视变换
  3. 正则(?=)(?:)
  4. [1996 TRO] Probabilistic Roadmaps for Path Planning in High-Dimensional Configuration Spaces
  5. 音频文件(.wav)解析读取
  6. Java WorkBook对Excel的基本操作
  7. 计算机类所有一级刊物,核心期刊介绍
  8. pe没法给服务器装系统吗,U盘重装系统无法进入PE解决方法
  9. RTX Excption integer divided by zero at loc (proc= thread=)Process image has been *unloaded
  10. 集线器、网桥、交换机简介