本文介绍了常见的网络爬虫工具*Scrapy的安装及使用过程*,另外介绍了Scrapy运行时常见问题以及相应解决办法,希望能对您的学习带来帮助。

Scrapy简介

Scrapy是一个快速高级屏幕抓取和爬行网页的框架,用来抓取的网站,从网页中抽取结构化的数据。它可以用于广泛的用途,从数据挖掘到监控和自动化测试。

官方主页: http://www.scrapy.org/

安装Python2.7

官方主页:http://www.python.org/

下载地址:http://www.python.org/ftp/python/2.7.3/python-2.7.3.msi

安装python

安装目录:D:\Python27

添加环境变量

略System Properties -> Advanced -> Environment Variables - >System Variables -> Path -> Edit

验证环境变量

T:\>set Path
Path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;D:\Rational\common;D:\Rational\ClearCase\bin;D:\Python27;D:\Python27\Scripts
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH

验证Python

T:\>python
Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()T:\>

安装Scrapy

官方主页:http://scrapy.org/

下载地址:http://pypi.python.org/packages/source/S/Scrapy/Scrapy-0.14.4.tar.gz

解压过程:略

安装过程:

T:\Scrapy-0.14.4>python setup.py install……
Installing easy_install-2.7-script.py script to D:\Python27\Scripts
Installing easy_install-2.7.exe script to D:\Python27\Scripts
Installing easy_install-2.7.exe.manifest script to D:\Python27\ScriptsUsing d:\python27\lib\site-packages
Finished processing dependencies for Scrapy==0.14.4T:\Scrapy-0.14.4>

验证安装:

T:\>scrapy
Scrapy 0.14.4 - no active projectUsage:scrapy <command> [options] [args]Available commands:fetch         Fetch a URL using the Scrapy downloaderrunspider     Run a self-contained spider (without creating a project)settings      Get settings valuesshell         Interactive scraping consolestartproject  Create new projectversion       Print Scrapy versionview          Open URL in browser, as seen by ScrapyUse "scrapy <command> -h" to see more info about a commandT:\>

生成项目

scrapy提供一个工具来生成项目,生成的项目中预置了一些文件,用户需要在这些文件中添加自己的代码。
打开命令行,执行:scrapy startproject tutorial,生成的项目类似下面的结构
tutorial/
scrapy.cfg
tutorial/
init.py
items.py
pipelines.py
settings.py
spiders/
init.py

scrapy.cfg是项目的配置文件
用户自己写的spider要放在spiders目录下面,建立一个dmoz.py文件,如下图

内容如下:

from scrapy.spider import BaseSpider
class DmozSpider(BaseSpider):name = "dmoz"allowed_domains = ["dmoz.org"]start_urls = ["http://pangjiuzala.github.io/"]def parse(self, response):filename = response.url.split("/")[-2]open(filename, 'wb').write(response.body)

name属性很重要,不同spider不能使用相同的name
start_urls是spider抓取网页的起始点,可以包括多个url
parse方法是spider抓到一个网页以后默认调用的callback,避免使用这个名字来定义自己的方法。
当spider拿到url的内容以后,会调用parse方法,并且传递一个response参数给它,response包含了抓到的网页的内容,在parse方法里,你可以从抓到的网页里面解析数据。上面的代码只是简单地把网页内容保存到文件。
开始抓取
你可以打开命令行,进入生成的项目根目录tutorial/,执行 scrapy crawl dmoz, dmoz是spider的name。
解析网页内容
scrapy提供了方便的办法从网页中解析数据,这需要使用到HtmlXPathSelector

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
class DmozSpider(BaseSpider):name = "dmoz"allowed_domains = ["dmoz.org"]start_urls = ["http://pangjiuzala.github.io/"]def parse(self, response):hxs = HtmlXPathSelector(response)sites = hxs.select('//ul/li')for site in sites:title = site.select('a/text()').extract()link = site.select('a/@href').extract()desc = site.select('text()').extract()print title, link, desc

HtmlXPathSelector使用了Xpath来解析数据
//ul/li表示选择所有的ul标签下的li标签
a/@href表示选择所有a标签的href属性
a/text()表示选择a标签文本
a[@href=”abc”]表示选择所有href属性是abc的a标签
我们可以把解析出来的数据保存在一个scrapy可以使用的对象中,然后scrapy可以帮助我们把这些对象保存起来,而不用我们自己把这些数据存到文件中。我们需要在items.py中添加一些类,这些类用来描述我们要保存的数据

from scrapy.item import Item, Field
class DmozItem(Item):title = Field()link = Field()desc = Field()

然后在spider的parse方法中,我们把解析出来的数据保存在DomzItem对象中。

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from tutorial.items import DmozItem
class DmozSpider(BaseSpider):name = "dmoz"allowed_domains = ["dmoz.org"]start_urls = ["http://pangjiuzala.github.io/       ]def parse(self, response):hxs = HtmlXPathSelector(response)sites = hxs.select('//ul/li')items = []for site in sites:item = DmozItem()item['title'] = site.select('a/text()').extract()item['link'] = site.select('a/@href').extract()item['desc'] = site.select('text()').extract()items.append(item)return items

在命令行执行scrapy的时候,我们可以加两个参数,让scrapy把parse方法返回的items输出到json文件中
scrapy crawl dmoz -o items.json -t json
items.json会被放在项目的根目录
让scrapy自动抓取网页上的所有链接
上面的示例中scrapy只抓取了start_urls里面的两个url的内容,但是通常我们想实现的是scrapy自动发现一个网页上的所有链接,然后再去抓取这些链接的内容。为了实现这一点我们可以在parse方法里面提取我们需要的链接,然后构造一些Request对象,并且把他们返回,scrapy会自动的去抓取这些链接。代码类似:

class MySpider(BaseSpider):name = 'myspider'start_urls = ('http://example.com/page1','http://example.com/page2',)def parse(self, response):# collect `item_urls`for item_url in item_urls:yield Request(url=item_url, callback=self.parse_item)def parse_item(self, response):item = MyItem()# populate `item` fieldsyield Request(url=item_details_url, meta={'item': item},callback=self.parse_details)def parse_details(self, response):item = response.meta['item']# populate more `item` fieldsreturn item

parse是默认的callback, 它返回了一个Request列表,scrapy自动的根据这个列表抓取网页,每当抓到一个网页,就会调用parse_item,parse_item也会返回一个列表,scrapy又会根据这个列表去抓网页,并且抓到后调用parse_details
为了让这样的工作更容易,scrapy提供了另一个spider基类,利用它我们可以方便的实现自动抓取链接. 我们要用到CrawlSpider

from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
class MininovaSpider(CrawlSpider):name = 'mininova.org'allowed_domains = ['mininova.org']start_urls = ['http://www.mininova.org/today']rules = [Rule(SgmlLinkExtractor(allow=['/tor/\d+'])),Rule(SgmlLinkExtractor(allow=['/abc/\d+']), 'parse_torrent')]def parse_torrent(self, response):x = HtmlXPathSelector(response)torrent = TorrentItem()torrent['url'] = response.urltorrent['name'] = x.select("//h1/text()").extract()torrent['description'] = x.select("//div[@id='description']").extract()torrent['size'] = x.select("//div[@id='info-left']/p[2]/text()[2]").extract()return torrent

相比BaseSpider,新的类多了一个rules属性,这个属性是一个列表,它可以包含多个Rule,每个Rule描述了哪些链接需要抓取,哪些不需要。这是Rule类的文档http://doc.scrapy.org/en/latest/topics/spiders.html#scrapy.contrib.spiders.Rule
这些rule可以有callback,也可以没有,当没有callback的时候,scrapy简单的follow所有这些链接.
pipelines.py的使用
在pipelines.py中我们可以添加一些类来过滤掉我们不想要的item,把item保存到数据库。

from scrapy.exceptions import DropItem
class FilterWordsPipeline(object):"""A pipeline for filtering out items which contain certain words in theirdescription"""# put all words in lowercasewords_to_filter = ['politics', 'religion']def process_item(self, item, spider):for word in self.words_to_filter:if word in unicode(item['description']).lower():raise DropItem("Contains forbidden word: %s" % word)else:return item

如果item不符合要求,那么就抛一个异常,这个item不会被输出到json文件中。
要使用pipelines,我们还需要修改settings.py
添加一行
ITEM_PIPELINES = [‘dirbot.pipelines.FilterWordsPipeline’]
现在执行scrapy crawl dmoz -o items.json -t json,不符合要求的item就被过滤掉了,这时在tutorial目录下会生成一个如下图所示的items.json文件

将数据保存到mysql数据库

数据库建表语句

create table book ( title char(15) not null, link varchar(50) COLLATE gb2312_chinese_ci DEFAULT NULL);

中文乱码问题

如果出现中文乱码问题请将数据库编码格式设置成gb2312_chinese_ci

配置pipelines.py

添加如下代码:

from scrapy import log
from twisted.enterprise import adbapi
from scrapy.http import Request
from scrapy.exceptions import DropItem
from scrapy.contrib.pipeline.images import ImagesPipeline
import time
import MySQLdb
import MySQLdb.cursors
import socket
import select
import sys
import os
import errnoclass MySQLStorePipeline(object):def __init__(self):self.dbpool = adbapi.ConnectionPool('MySQLdb',db = 'test',8 #数据库名称user = 'root', #数据库用户名passwd = '',  #数据库密码cursorclass = MySQLdb.cursors.DictCursor,charset = 'utf8',use_unicode = False)def process_item(self, item, spider):query = self.dbpool.runInteraction(self._conditional_insert, item)return itemdef _conditional_insert(self, tx, item):if item.get('title'):for i in range(len(item['title'])):tx.execute('insert into book values (%s, %s)', (item['title'][i], item['link'][i]))

配置setting.py

添加如下代码:

ITEM_PIPELINES = ['tutorial.pipelines.MySQLStorePipeline']

执行scrapy crawl dmoz

运行效果如下

Python脚本运行出现语法错误

解决方案:
http://www.crifan.com/python_syntax_error_indentationerror/comment-page-1/

生成的json文件编码默认为Unicode

如下:

[{"title": ["\u4e3b\u9875"], "tag": [], "link": ["/"], "desc": []},
{"title": ["\u6587\u7ae0\u5217\u8868"], "tag": [], "link": ["/archives"], "desc": []},
{"title": [], "tag": [], "link": [], "desc": ["\n \t\t\t\t\t\n\t\t\t\t\t", "\n\t\t\t\t\t\n\t\t\t\t\t"]},
{"title": ["Java"], "tag": [], "link": ["/tags/Java/"], "desc": []},
{"title": ["\u7b97\u6cd5"], "tag": [], "link": ["/tags/\u7b97\u6cd5/"], "desc": []},
{"title": ["\u6570\u636e\u6316\u6398"], "tag": [], "link": ["/tags/\u6570\u636e\u6316\u6398/"], "desc": []},
{"title": ["\u7269\u8054\u7f51"], "tag": [], "link": ["/tags/\u7269\u8054\u7f51/"], "desc": []},
{"title": ["C++"], "tag": [], "link": ["/tags/C/"], "desc": []},
{"title": ["openHAB"], "tag": [], "link": ["/tags/openHAB/"], "desc": []},
{"title": ["\u4e91\u8ba1\u7b97"], "tag": [], "link": ["/tags/\u4e91\u8ba1\u7b97/"], "desc": []},
{"title": ["C"], "tag": [], "link": ["/tags/C/"], "desc": []},
{"title": ["\u79fb\u52a8\u4e92\u8054\u7f51"], "tag": [], "link": ["/tags/\u79fb\u52a8\u4e92\u8054\u7f51/"], "desc": []},
{"title": ["GC"], "tag": [], "link": ["/tags/GC/"], "desc": []},
{"title": ["\u5927\u6570\u636e"], "tag": [], "link": ["/tags/\u5927\u6570\u636e/"], "desc": []},
{"title": ["\u5fae\u535a"], "tag": [], "link": ["http://weibo.com/jiayou087"], "desc": ["\n            \n            \t", "\n            \n          "]},
{"title": ["CSDN"], "tag": [], "link": ["http://blog.csdn.net/pangjiuzala"], "desc": ["\n            \n            \t", "\n            \n          "]},
{"title": ["July 2015"], "tag": [], "link": ["/archives/2015/07/"], "desc": []}]

解决方案:

配置pipelines.py文件

添加如下代码;

import json
import codecsclass JsonWriterPipeline(object):def __init__(self):self.file = codecs.open('items.json', 'w', encoding='utf-8')def process_item(self, item, spider):line = json.dumps(dict(item)) + "\n"self.file.write(line.decode('unicode_escape'))return item

配置settings.py文件

添加如下代码;

ITEM_PIPELINES = {'tutorial.pipelines.JsonWriterPipeline'}

转化后的数据如下:

[{"title": ["主页"], "tag": [], "link": ["/"], "desc": []},
{"title": ["文章列表"], "tag": [], "link": ["/archives"], "desc": []},
{"title": [], "tag": [], "link": [], "desc": ["\n \t\t\t\t\t\n\t\t\t\t\t", "\n\t\t\t\t\t\n\t\t\t\t\t"]},
{"title": ["Java"], "tag": [], "link": ["/tags/Java/"], "desc": []},
{"title": ["算法"], "tag": [], "link": ["/tags/算法/"], "desc": []},
{"title": ["数据挖掘"], "tag": [], "link": ["/tags/数据挖掘/"], "desc": []},
{"title": ["物联网"], "tag": [], "link": ["/tags/物联网/"], "desc": []},
{"title": ["C++"], "tag": [], "link": ["/tags/C/"], "desc": []},
{"title": ["openHAB"], "tag": [], "link": ["/tags/openHAB/"], "desc": []},
{"title": ["云计算"], "tag": [], "link": ["/tags/云计算/"], "desc": []},
{"title": ["C"], "tag": [], "link": ["/tags/C/"], "desc": []},
{"title": ["移动互联网"], "tag": [], "link": ["/tags/移动互联网/"], "desc": []},
{"title": ["GC"], "tag": [], "link": ["/tags/GC/"], "desc": []},
{"title": ["大数据"], "tag": [], "link": ["/tags/大数据/"], "desc": []},
{"title": ["微博"], "tag": [], "link": ["http://weibo.com/jiayou087"], "desc": ["\n            \n            \t", "\n            \n          "]},
{"title": ["CSDN"], "tag": [], "link": ["http://blog.csdn.net/pangjiuzala"], "desc": ["\n            \n            \t", "\n            \n          "]},
{"title": ["July 2015"], "tag": [], "link": ["/archives/2015/07/"], "desc": []}]

使用Beautiful Soup

详情链接:
http://kevinkelly.blog.163.com/blog/static/21390809320133185748442/

Scrapy安装及使用相关推荐

  1. Python Scrapy 安装及相关配置

    本文仅供学习交流使用,如侵立删!demo下载见文末 Python Scrapy 安装及相关配置 环境 win10 Python:3.6.7 Scrapy:2.4.1 Python 安装

  2. scrapy 安装_安装scrapy时出错

    Python3环境下安装scrapy 环境:win7,win10 Python 3.5.2 1.首先打开Anaconda Prompt 执行命令: pip install scrapy 若未出错,表示 ...

  3. python爬虫的scrapy安装+pymongo的安装

    我的:python2.7版本    32位 注意scrapy只支持2.7及以上的版本. 1.安装python 2.安装pip 安装pip就不赘述了,网上很多教学 pip安装时要注意更新,如果pip版本 ...

  4. scrapy 安装技巧

    scrapy 安装技巧 手动安装twisted插件: 1.在http://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted用Ctrl+F搜索twisted,下载对 ...

  5. Scrapy安装介绍

    Scrapy安装介绍 一. Scrapy简介 Scrapy is a fast high-level screen scraping and web crawling framework, used ...

  6. scrapy安装_爬虫框架Scrapy简介与安装

    Scrapy 框架 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页 ...

  7. Python3.7 Scrapy安装(Windows)

    2019独角兽企业重金招聘Python工程师标准>>> 本文分为两个部分,前大半部分说的都是Windows下手动安装Scrapy,文末给初学编程的童鞋或者不想这么手工安装的童鞋推荐了 ...

  8. linux下scrapy安装教程,linux centos7安装scrapy

    linux centos7安装scrapy 时间:2018-01-02 17:41作者:scrapy中文网阅读: 本scrapy中文教程主要介绍,centos7 linux下scrapy的安装,pyt ...

  9. Python3.6+Twisted+Scrapy安装

    一.首先检查是否有openssl-devel 这一步是必要的,可能会导致PIP命令报错,安装后需重新编译Python 检查命令:# rpm -aq|grep openssl 安装命令:# yum in ...

  10. python scrapy安装_Python安装Scrapy

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我们测试一下:# scrapy version-bash: scrapy: 未找 ...

最新文章

  1. php字符串定义为arraylist,如何把arraylist集合中的字符串数据保存的文本文件中
  2. 从做大牛那里整理的Python函数相关的学习笔记,希望对你有帮助
  3. boost::interprocess::anonymous_shared_memory用法的测试程序
  4. caffe编译报错 cudnn.hpp:127:41: error: too few arguments to function ‘cudnnStatus_t cudnnSetPooling2dDe
  5. cifs文件系统{samba文件共享服务}
  6. css 波纹扩散_html5 +css3 点击后水波纹扩散效果 兼容移动端
  7. Win11系统获取管理员权限的方法
  8. 报错,could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarExc
  9. Android 系统(74)--Android重启原因分析
  10. java mysql limit分页,MySQL limit使用方法以及超大分页问题解决
  11. 一流的企业做标准,二流的企业做品牌,三流的企业做产品怎么理解
  12. Win7安装 boost库
  13. zzulioj :2020新生赛:花海
  14. 视频可以裁剪尺寸吗?教你裁剪尺寸的小妙招
  15. 南阳oj入门题-A+B Problem
  16. Introdution(前言)
  17. 【FFmpeg】通过编解码ID(AV_CODEC_ID_*)获取编解码器AVCodec指针的过程分析
  18. Adobe CS5简体中文版官方下载地址
  19. 【转】HTML5斯诺克桌球俱乐部【译】
  20. Kaggle系列-IEEE-CIS Fraud Detection第一名复现

热门文章

  1. 双坐标轴echarts
  2. 七八年级计算机教案,中学七八年级信息技术教案全集.doc
  3. 铁路局12306余票查询的实现
  4. 团购网如何成功实现平台化转型
  5. 安卓Accessibility(Talkback无障碍读屏器)适配笔记
  6. TensorFlow 机器学习秘籍中文第二版(初稿)
  7. 下载地图操作步骤(卫星地图、电子地图…)
  8. 2.11 流水线加速比
  9. Go web开发初探
  10. 经济学人(The Economist)导读(阅时即查,每日更新)