设为首页 收藏本站
查看: 1482|回复: 0

[经验分享] Scrapy在windows中的搭建配置记录(2)

[复制链接]

尚未签到

发表于 2018-6-23 11:31:13 | 显示全部楼层 |阅读模式
2.重整旗鼓1)安装好Python 2.7.6,修改环境变量path中的两个c:\Python27;c:\Python27\Scripts2)OpenSSL就不用重新装了。https://launchpad.net/pyopenssl下载pyOpenssl,重新下py2.7-msi版本的。https://pypi.python.org/pypi/lxml/3.3.5下载lxml3.3.5版本的win32 py2.7.傻瓜式安装完成https://pypi.python.org/pypi/zope.interface/4.1.1#downloads下载zope.interface-4.1.1.win32-py2.7.exe跟上一个安装一样的。http://twistedmatrix.com/trac/wiki/Downloads下载twisted 14.0.0 for Python 2.7 exe版本。    安装pip。https://pip.pypa.io/en/latest/installing.html在这里下载了get-pip.py 按照里面的教程在cmd输入python get-pip.py即可安装成功。 3)不知道为啥按照昨天的步骤装了,在cmd里输入pip install Scrapy却有一堆错误。继续重新安装了Visual C++ 2008 Redistributables,这次网络比较好,安装成功。    今天又下载了http://sourceforge.net/projects/pywin32/files/?source=navbar  219版本,竟然也下载成功了。求保佑啊    安装完了,又安装easy_install, 在这里https://pypi.python.org/pypi/setuptools下载。特么的安装的时候又出错了。这次是编码问题。上网搜解决办法,    还好最后还是解决了。报错信息UnicodeDecodeError: ’ascii’ codec can’t decode byte 0xb0 in position 1: ordinal not in range(128)  原因与注册表有关,可能与某些国产软件对注册表的改写的gbk格式导致python无法进行第三方库的安装操作。解决方法:打开C:\Python27\Lib下的 mimetypes.py 文件,找到大概256行(你可以用Notepad++的搜索功能)的  ‘default_encoding = sys.getdefaultencoding()’。
if sys.getdefaultencoding() != ‘gbk’:             reload(sys)            sys.setdefaultencoding(‘gbk’)        default_encoding = sys.getdefaultencoding()    这里一定要注意缩进和字符的中英格式。    果然改过之后就成功安装了。
DSC0000.jpg

  拭目以待Scrapy的安装。在cmd中输入easy_install Scrapy,终于开始成功的安装了。先去吃饭了。
DSC0001.jpg

果然安装成功了,好开心呢下面我们就可以按照教程开始尝试创建项目了。
DSC0002.jpg

不知道这个是不是成功的意思?我们来看看目录,果然在c:\Python27下面有个新的目录tutorial  它的目录结构如下:
tutorial/  scrapy.cfg
  tutorial/
  __init__.py
  items.py
  pipelines.py
  settings.py
  spiders/
  __init__.py
  ...
  这是一些基本信息:

  •   scrapy.cfg: 项目的配置文件。
  •   tutorial/: 项目的python模块, 在这里稍后你将会导入你的代码。
  •   tutorial/items.py: 项目items文件。
  •   tutorial/pipelines.py: 项目管道文件。
  •   tutorial/settings.py: 项目配置文件。
  •   tutorial/spiders/: 你将要放入你的spider到这个目录中。
修改items.py如攻略中所说  Items是装载我们抓取数据的容器。它们工作像简单的Python字典,它提供更多的保护,比如对未定义的字段提供填充功能防止出错。
  它们通过创建scrapy.item.Item类来声明并定义它们的属性作为scrapy.item.Field 对象,就像是一个对象关系映射(假如你不熟悉ORMs,你将会看见它是一个简单的任务).
  我们将需要的item模块化,来控制从demoz.org网站获取的数据,比如我们将要去抓取网站的名字,url和描述信息。我们定义这三种属性的域。我们编辑items.py文件,它在向导目录中。我们Item类看起来像这样。
fromscrapy.item importItem, Field  
classDmozItem(Item):
  
title =Field()
  
link =Field()
  
desc =Field()
  这个看起来复杂的,但是定义这些item能让你用其他Scrapy组件的时候知道你的item到底是什么
  这下好了,配置的过程终于完成了,那么下面我们就要做一个真正意义上的爬虫了。
  依然是照葫芦画瓢,从攻略上copy过来的:
  Spiders是用户写的类,它用来去抓取一个网站的信息(或者一组网站) 。
  我们定义一个初始化的URLs列表去下载,如何跟踪链接,如何去解析这些页面的内容去提取 items.创建一个Spider,你必须是scrapy.spider.BaseSpider的子类, 并定义三个主要的,强制性的属性。

  •   名字: Spider的标识. 它必须是唯一的, 那就是说,你不能在不同的Spiders中设置相同的名字。
  •   开始链接:Spider将会去爬这些URLs的列表。所以刚开始的下载页面将要包含在这些列表中。其他子URL将会从这些起始URL中继承性生成。
  •   parse() 是spider的一个方法, 调用时候传入从每一个URL传回的Response对象作为参数。response是方法的唯一参数。
      这个方法负责解析response数据和提出抓取的数据(作为抓取的items),跟踪URLs
      parse()方法负责处理response和返回抓取数据(作为Item对象) 和跟踪更多的URLs(作为request的对象)
  这是我们的第一个Spider的代码;由于没有详细的说明,我只好按照意思暂时将它它保存在c:\Python27\project\dmoz\spiders文件夹中,被命名为dmoz_spider.py:
fromscrapy.spider importBaseSpider  
classDmozSpider(BaseSpider):
  
name ="dmoz"
  
allowed_domains =["dmoz.org"]
  
start_urls =[
  
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
  
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
  
]
  
defparse(self, response):
  
filename =response.url.split("/")[-2]
  
open(filename, 'wb').write(response.body)
  尝试着在cmd中进入到目录,然后运行scrapy crawl dmoz,结果给我返回这么一串
DSC0003.jpg

  尝试了各种目录,发现还是不行。明显原文没有解释清楚这个路径到底是怎么回事。后来在网上查,把这个文件dmoz_spider.py放在
  c:\Python27\tutorial\turorial\spiders里面,果然可以顺利运行了,虽然还带着警告,撒花!界面截图如下:
DSC0004.jpg

DSC0005.jpg

  注意那些行包含[dmoz], 它和我们的spider相关。你能够看见每行初始化的URL日志信息。因为这些URLs是起始页面,所以他们没有引用referrers。 所以在每行的末尾部分,你能看见(referer: <None>).
  但是有趣的是,在我们的parse方法作用下,创建了两个文件: Books and Resources, 它保存两个URLs的内容
刚刚发生了什么事情?
  Scrapy为每一个start_urls创建一个scrapy.http.Request对象,并将爬虫的parse 方法指定为回调函数。
  这些Request首先被调度,然后被执行,之后通过parse()方法,将scrapy.http.Response对象被返回,结果也被反馈给爬虫。
  那么下面我们再做点什么呢?
提取Items
选择器介绍
  我们有多种方式去提取网页中数据。Scrapy 使用的是XPath表达式,通常叫做XPath selectors。如果想了解更多关于选择器和提取数据的机制,可以看看如下教程XPath selectors documentation.这里我建议
  到w3cschool学习xpath的教程,简单易懂,基本上一两个小时就能明白。
  这里有一些表达式的例子和它们相关的含义:

  •   /html/head/title: 选择<title>元素,在HTML文档的<head>元素里
  •   /html/head/title/text(): 选择<title>元素里面的文本
  •   //td: 选择所有的<td>元素
  •   //div[@class="mine"]: 选择所有的div元素里面class属性为mine的
  这里有许多的例子关于怎么使用XPath,可以说XPath表达式是非常强大的。如果你想要学习更多关于XPath,我们推荐如下教程this XPath tutorial.
  为了更好使用XPaths, Scrapy提供了一个XPathSelector类,它有两种方式, HtmlXPathSelector(HTML相关数据)和XmlXPathSelector(XML相关数据)。如果你想使用它们,你必须实例化一个Response对象.
  你能够把selectors作为对象,它代表文件结构中的节点。所以,第1个实例的节点相当于root节点,或者称为整个文档的节点。
  选择器有三种方法(点击方法你能够看见完整的API文档)。

  •   select(): 返回选择器的列表,每一个select表示一个xpath表达式选择的节点。
  •   extract(): 返回一个unicode字符串 ,该字符串XPath选择器返回的数据。
  •   re(): 返回unicode字符串列表,字符串作为参数由正则表达式提取出来。
在Shell里面使用选择器
  为了更加形象的使用选择器,我们将会使用Scrapy shell,它同时需要你的系统安装IPython (一个扩展的Python控制台)。
  如果使用shell,你必须到项目的顶级目录上即c:\Python27\tutorial,然后运行如下命令:
scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/  shell将会显示如下的信息:
DSC0006.jpg

  当shell装载之后,你将会得到一个response的本地变量。所以你输入reponse.body,你能够看见response的body部分或者你能够输入response.headers,你能够看见reponse.headers部分。
  shell同样实例化了两个选择器,一个是HTML(在hvx变量里),一个是XML(在xxs变量里)。所以我们尝试怎么使用它们:
DSC0007.jpg

  提取数据Extracting the data
  现在我们开始尝试在这几个页面里提取真正的信息。
  你能够在控制台里面输入response.body,检查源代码里面的XPaths是否与预期相同。然而,检查原始的HTML代码是一件非常枯燥乏味的事情。假如你想让你的工作变的简单,你使用Firefox扩展的插件例如Firebug来做这项任务。其实我一般都是用chrome的审查元素,感觉更方面。更多关于介绍信息请看Using Firebug for scraping和Using Firefox for scraping。
  当你检查了页面源代码之后,你将会发现页面的信息放在一个<ul>元素里面,事实上,确切地说是第二个<ul>元素。
  所以我们选择每一个<li>元素使用如下的代码:
  hxs.select('//ul/li')
  网站的描述信息可以使用如下代码:
  hxs.select('//ul/li/text()').extract()
  网站的标题:
  hxs.select('//ul/li/a/text()').extract()
  网站的链接:
  hxs.select('//ul/li/a/@href').extract()
  如前所述,每个select()调用返回一个selectors列表,所以我们可以结合select()去挖掘更深的节点。我们将会用到这些特性,所以:
  sites =hxs.select('//ul/li')
  forsite insites:
  title =site.select('a/text()').extract()
  link =site.select('a/@href').extract()
  desc =site.select('text()').extract()
  printtitle, link, desc
  将代码添加到我们spider中:
  
from scrapy.spider import BaseSpider  
from scrapy.selector import HtmlXPathSelector
  
class DmozSpider(BaseSpider):
  name = "dmoz"
  allowed_domains = ["dmoz.org"]
  start_urls = [
  "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
  "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
  ]
  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>  
  再次从cmd进入到c:\Python27\tutorial目录输入scrapy crawl dmoz
  可以看到这次输出的内容有了好些变化。这些内容就是我们使用上面的代码获取的text和href
DSC0008.jpg

使用我们的 item
Item对象是自定义python字典;使用标准字典类似的语法,你能够访问它们的字段(就是以前我们定义的属性) >>> item = DmozItem()>>> item['title'] = 'Example>>>> item['title']'Example>  Spiders希望将抓取的数据放在 Item对象里。所以,为了返回我们抓取的数据,最终的代码要如下这么写 :
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://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
  "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
  ]
  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
现在重新抓取dmoz.org网站。存储抓取的数据
到了这一步,大家应该都明白了吧,把数据存储起来。最简单的方式去存储抓取的数据是使用Feed exports,使用如下的命令:scrapy crawl dmoz -o items.json -t json  它将会产生一个items.json文件,它包含所有抓取的items(序列化的JSON)。
  在一些小的项目里(例如我们的教程中),那就足够啦。然而,假如你想要执行更多复杂的抓取items,你能够写一个 Item Pipeline。 因为在项目创建的时候,一个专门用于Item Pipelines的占位符文件已经随着项目一起被建立,目录在tutorial/pipelines.py。如果你只需要存取这些抓取后的items的话,就不需要去实现任何的条目管道。
  执行这条命令让我们来看看发生了什么。
  找到tutorial的根目录,即c:\Python27\tutorial,我们发现在这里多了一个item.json文件,一开始我发现里面是空白的,不知道为什么,查看了控制台,发现是没有抓取任何东西,可能是网速问题造成页面打开失败了。又重新执行了一下就没有问题,此时的items.json里面有了一些数据。如下所示:
DSC0009.jpg

  好了,基本的功能都已经实现了,今天就先到这里吧。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-529539-1-1.html 上篇帖子: Scrapy在windows中的搭建配置记录(1) 下篇帖子: Symantec Backup Exec 2012 修改用户界面显示的语言
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表