Python scrapy 实现网页爬虫

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.html

import scrapy
class ScrapyPrjItem(scrapy.Item):
    # define the fields for your item here like:
    site_name = scrapy.Field()
    url = scrapy.Field()


spider实现

import scrapy
from scrapy.selector import Selector
from scrapy_prj.items import ScrapyPrjItem

class DmozSpider(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_local
            items.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()
    #提取链接url
    url_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_local
    items.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 codecs

class 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的执行结果

时间: 2024-10-03 14:02:11

Python scrapy 实现网页爬虫的相关文章

python scrapy 简单的爬虫

1 scrapy的文档 比较简单 http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/overview.html 我假定你已经安装了Scrapy.假如你没有安装,你可以参考这篇文章. 在本文中,我们将学会如何使用Scrapy建立一个爬虫程序,并爬取指定网站上的内容 1. 创建一个新的Scrapy Project scrapy creatproject "project-name" 2. 定义你需要从网页中提取的元素Item 3.实现一

网页爬虫--scrapy入门

本篇从实际出发,展示如何用网页爬虫.并介绍一个流行的爬虫框架~ 1. 网页爬虫的过程 所谓网页爬虫,就是模拟浏览器的行为访问网站,从而获得网页信息的程序.正因为是程序,所以获得网页的速度可以轻易超过单身多年的手速:).通常适用于需要大量网页信息的场合. 爬取网页的流程为:访问初始url -> 获得返回的网页,从这个网页中得到新的url并放入待爬队列 -> 访问新的url-> ...依次循环.整体上来看就是一个广度优先的过程,当然,新的url也不一定非要从返回的网页中获得. 一个简单的网页

Python 网页爬虫 &amp; 文本处理 &amp; 科学计算 &amp; 机器学习 &amp; 数据挖掘兵器谱(转)

原文:http://www.52nlp.cn/python-网页爬虫-文本处理-科学计算-机器学习-数据挖掘 曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开发语言是C/C++,但平时的很多文本数据处理任务都交给了Python.离开腾讯创业后,第一个作品课程图谱也是选择了Python系的Flask框架,渐渐的将自己的绝大部分工作交给了Python.这些年来,接触和使用了很多Python工具包,特别是在文本处理,科学计算,机器学习和数据挖掘领域,有很多很多

【Python】Python 网页爬虫 &amp; 文本处理 &amp; 科学计算 &amp; 机器学习 &amp; 数据挖掘兵器谱

好文 mark http://www.52nlp.cn/python-%E7%BD%91%E9%A1%B5%E7%88%AC%E8%99%AB-%E6%96%87%E6%9C%AC%E5%A4%84%E7%90%86-%E7%A7%91%E5%AD%A6%E8%AE%A1%E7%AE%97-%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0-%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98 曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工

Python Scrapy爬虫(上)

Python Scrapy爬虫 预备知识: 1.Scrapy框架:是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架. 2.Scrapy去重原理:Scrapy本身自带有一个中间件.scrapy源码中可以找到一个dupefilters.py去重器,需要将dont_filter设置为False开启去重,默认是True,没有开启去重. 3.指纹去重:对于每一个URL的请求,调度器都会根据请求得相关信息加密得到一个指纹信息,并且将该URL的指纹信息和set()集合中的指纹信息进行

Python天气预报采集器 python网页爬虫

这个天气预报采集是从中国天气网提取广东省内主要城市的天气并回显.本来是打算采集腾讯天气的,但是貌似它的数据是用js写上去还是什么的,得到的html文本中不包含数据,所以就算了 爬虫简单说来包括两个步骤:获得网页文本.过滤得到数据. 1.获得html文本.  python在获取html方面十分方便,寥寥数行代码就可以实现需要的功能. def getHtml(url): page = urllib.urlopen(url) html = page.read() page.close() return

Python 网页爬虫

一.要解决的问题 需要解决的是根据自定义的关键词自动搜索google学术,解析搜索到的网页,下载所有相应的论文的PDF链接.这里我们采用Python来实现, 二.Python入门 python 自动缩进:shift+table整块向左缩进,table向右缩进,在修改整块代码时很有用比如将函数变成单独执行时. 了解python的变量,包,函数定义等 三.网页知识 3.1 浏览网页的过程 打开网页的过程其实就是浏览器作为一个浏览的“客户端”,向服务器端发送了 一次请求,把服务器端的文件“抓”到本地,

Python Scrapy 自动爬虫注意细节

一.首次爬取模拟浏览器 在爬虫文件中,添加start_request函数.如: def start_requests(self): ua = {"User-Agent": 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.104 Safari/537.36 Core/1.53.2050.400 QQBrowser/9.5.10169.400'} yie

多线程网页爬虫 python 实现

采用了多线程和锁机制,实现了广度优先算法的网页爬虫. 对于一个网络爬虫,如果要按广度遍历的方式下载,它就是这样干活的:         1.从给定的入口网址把第一个网页下载下来         2.从第一个网页中提取出所有新的网页地址,放入下载列表中         3.按下载列表中的地址,下载所有新的网页         4.从所有新的网页中找出没有下载过的网页地址,更新下载列表         5.重复3.4两步,直到更新后的下载列表为空表时停止 python实现代码如下: #!/usr/b