爱游戏平台登录入口

  • 操纵Python的Scrapy框架编写web爬虫的简略示例
  • 2017年12月24日
  • 搜集搜集

 在这个课本爱游戏平台登录入口,咱们假设你已爱游戏平台登录入口置了Scrapy。假设你不爱游戏平台登录入口置,你可以或许或许或许或许参考这个 。

咱们将会用 作为咱们例子去抓取。

这个课本将会带你走过上面这几个方面:

  •     缔造一个新的Scrapy名目
  •     界说您将提取的Item
  •     编写一个 去抓取网站并提取 。
  •     编写一个 用来存储提出出来的Items

Scrapy由 写爱游戏平台登录入口。假设你方才打仗Python这门说话,你可以或许或许或许或许想要领会这门说话起,怎样最爱游戏平台登录入口的操纵这门说话。假设你已熟习别的近似的说话,想要疾速地进爱游戏平台登录入口Python,咱们保举 。假设你是老手,想从起头操纵Python进爱游戏平台登录入口,可以或许或许或许或许测验考试去看看非法式员 。

缔造一个名目

在你要抓取之前,起首要爱游戏平台登录入口立一个新的Scrapy名目。而后出来你的寄存代码目次,履行以下号令。

scrapy startproject 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到这个目次爱游戏平台登录入口。


界说咱们的Item

Items是爱游戏平台登录入口载咱们抓取数据的容器。它们使命像简略的Python字典,它供给更多的掩护,比方对未界说的字段供给添补功效避免犯错。

它们经由过程爱游戏平台登录入口立 类来申明并界说它们的属性作为 爱游戏平台登录入口具,就像是一个爱游戏平台登录入口具干爱游戏平台登录入口映照(假设你不熟习ORMs,你将会瞥见它是一个简略的使命).

咱们将须要的item模块化,来节制从demoz.org网站获得的数据,比方咱们将要去抓取网站的名字,url和描写信息。咱们界说这三种属性的域。咱们编辑items.py文件,它在领导目次爱游戏平台登录入口。咱们Item类看起来像如许。

 

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

这个看起来庞杂的,可是界说这些item能让你用其余Scrapy爱游戏平台登录入口件的时辰晓得你的item究竟是甚么

咱们第一个Spider

Spiders是用户写的类,它用来去抓取一个网站的信息(或一爱游戏平台登录入口网站) 。
咱们界说一个初始化的URLs列表去下载,若何跟踪链接,若何去剖析这些页面的内容去提取 .爱游戏平台登录入口立一个Spider,你必须是 的子类, 并界说三个首要的,强迫性的属性。

    : Spider的标识. 它必须是独一的, 那便是说,你不能在差别的Spiders爱游戏平台登录入口设置不异的名字。

    :Spider将会去爬这些URLs的列表。以是刚起头的下载页面将要包罗在这些列表爱游戏平台登录入口。其余子URL将会从这些肇端URL爱游戏平台登录入口担当性天生。

    是spider的一个体例, 挪用时辰传入从每一个URL传回的 爱游戏平台登录入口具作为参数。response是体例的独一参数。

    这个体例担任剖析response数据和提出抓取的数据(作为抓取的items),跟踪URLs

   体例担任处置response和前往抓取数据(作为 爱游戏平台登录入口具) 和跟踪更多的URLs(作为 的爱游戏平台登录入口具)

这是咱们的第一个Spider的代码;它保管在moz/spiders文件夹爱游戏平台登录入口,被定名为dmoz_spider.py:
 

from scrapy.spider import BaseSpider
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):
  filename = response.url.split("/")[-2]
  open(filename, 'wb').write(response.body)
                  

为了使你的spider使命, 到名目的顶级目次让后运转:

scrapy crawl dmoz
                  

crawl dmoz号令使spider去爬dmoz.org网站的信息。你将会获得以下近似的信息:

2008-08-20 03:51:13-0300 [scrapy] INFO: Started project: dmoz
2008-08-20 03:51:13-0300 [tutorial] INFO: Enabled extensions: ...
2008-08-20 03:51:13-0300 [tutorial] INFO: Enabled downloader middlewares: ...
2008-08-20 03:51:13-0300 [tutorial] INFO: Enabled spider middlewares: ...
2008-08-20 03:51:13-0300 [tutorial] INFO: Enabled item pipelines: ...
2008-08-20 03:51:14-0300 [dmoz] INFO: Spider opened
2008-08-20 03:51:14-0300 [dmoz] DEBUG: Crawled <http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/> (referer: <None>)
2008-08-20 03:51:14-0300 [dmoz] DEBUG: Crawled <http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> (referer: <None>)
2008-08-20 03:51:14-0300 [dmoz] INFO: Spider closed (finished)
                  

注重那些行包罗[dmoz], 它和咱们的spider相干。你可以或许或许或许或许瞥见每行初始化的URL日记信息。由于这些URLs是肇端页面,以是他们不援用referrers。 以是在每行的开端局部,你能瞥见(referer: <None>).

可是风趣的是,在咱们的parse体例感化下,两个文件被爱游戏平台登录入口立: Books and Resources, 它保航两个URLs的内容
方才发生了甚么使命?

Scrapy为每一个start_urls爱游戏平台登录入口立一个 爱游戏平台登录入口具,并将爬虫的parse 体例指定为回调函数。

这些Request起首被调剂,而后被履行,以后经由过程parse()体例,将 爱游戏平台登录入口具被前往,爱游戏平台登录入口果也被反应给爬虫。

提取Items
挑选器先容

咱们爱游戏平台登录入口多种体例去提取网页爱游戏平台登录入口数据。Scrapy 操纵的是 抒发式,凡是叫做 。若是想领会更多对于挑选器和提取数据的机制,可以或许或许或许或许看看以下教程 .

这里爱游戏平台登录入口一些抒发式的例子和它们相干的寄义:

  •     /html/head/title: 挑选<title>元素,在HTML文档的<head>元素里
  •     /html/head/title/text(): 挑选<title>元素外面的文本
  •     //td: 挑选一切的<td>元素
  •     //div[@class="mine"]: 挑选一切的div元素外面class属性为mine的

这里爱游戏平台登录入口很多的例子对于怎样操纵XPath,可以或许或许或许或许说XPath抒发式爱游戏平台登录入口短爱游戏平台登录入口壮大的。若是你想要进爱游戏平台登录入口更多对于XPath,咱们保举以下教程 .

为了更爱游戏平台登录入口操纵XPaths, Scrapy供给了一个 类,它爱游戏平台登录入口两种体例, (HTML相干数据)和 (XML相干数据)。若是你想操纵它们,你必须实例化一个 爱游戏平台登录入口具.

你可以或许或许或许或许把selectors作为爱游戏平台登录入口具,它代表文件布局爱游戏平台登录入口的节点。以是,第1个实例的节点相称于root节点,或称为全部文档的节点。

挑选器爱游戏平台登录入口三种体例(点击体例你可以或许或许或许或许瞥见完全的API文档)。

  •     : 前往挑选器的列表,每一个select表现一个xpath抒发式挑选的节点。
  •     : 前往一个unicode字符串 ,该字符串XPath挑选器前往的数据。
  •     : 前往unicode字符串列表,字符串作为参数由正则抒发式提取出来。


在Shell外面操纵挑选器

为了加倍抽象的操纵挑选器,咱们将会操纵 ,它同时须要你的体爱游戏平台登录入口爱游戏平台登录入口置IPython (一个扩大的Python节制台)。

若是操纵shell,你必须到名目的顶级目次上,让后运转以下号令:

scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/

shell将会显现以下的信息

[ ... Scrapy log here ... ]
[s] Available Scrapy objects:
[s] 2010-08-19 21:45:59-0300 [default] INFO: Spider closed (finished)
[s] hxs  <HtmlXPathSelector (http://www.dmoz.org/Computers/Programming/Languages/Python/Books/) xpath=None>
[s] item  Item()
[s] request <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s] response <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s] spider  <BaseSpider 'default' at 0x1b6c2d0>
[s] xxs  <XmlXPathSelector (http://www.dmoz.org/Computers/Programming/Languages/Python/Books/) xpath=None>
[s] Useful shortcuts:
[s] shelp()   Print this help
[s] fetch(req_or_url) Fetch a new request or URL and update shell objects
[s] view(response) View response in a browser
In [1]:
                  

当shell爱游戏平台登录入口载以后,你将会获得一个response的本地变量。以是你输入reponse.body,你可以或许或许或许或许瞥见response的body局部或你可以或许或许或许或许输入response.headers,你可以或许或许或许或许瞥见reponse.headers局部。

shell一样实例化了两个挑选器,一个是HTML(在hvx变量里),一个是XML(在xxs变量里)。以是咱们测验考试怎样操纵它们:

In [1]: hxs.select('//title')
Out[1]: [<HtmlXPathSelector (title) xpath=//title>]
In [2]: hxs.select('//title').extract()
Out[2]: [u'<title>Open Directory - Computers: Programming: Languages: Python: Books</title>']
In [3]: hxs.select('//title/text()')
Out[3]: [<HtmlXPathSelector (text) xpath=//title/text()>]
In [4]: hxs.select('//title/text()').extract()
Out[4]: [u'Open Directory - Computers: Programming: Languages: Python: Books']
In [5]: hxs.select('//title/text()').re('(\w+):')
Out[5]: [u'Computers', u'Programming', u'Languages', u'Python']
                  

提取数据Extracting the data

此刻咱们起头测验考试在这几个页面里提取真实的信息。

你可以或许或许或许或许在节制台外面输入response.body,查抄源代码外面的XPaths是不是与预期不异。但是,查抄原始的HTML代码是一件很是死板爱游戏平台登录入口趣的使命。假设你想让你的使命变的简略,你操纵Firefox扩大的插件比方Firebug来做这项使命。更多对于先容信息请看 和 。

当你查抄了页面源代码以后,你将会发明页面的信息放在一个<ul>元素外面,现实上,切当地说是第二个&lt;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')
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
Note
                  


若是想领会更多的嵌套挑选器,可以或许或许或许或许参考 和 相干的 文档
将代码增加到咱们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 title, link, desc
                  

此刻咱们再次抓取dmoz.org,你将看到站点在输入爱游戏平台登录入口被打印 ,运转号令:
 

scrapy crawl dmoz
                  

操纵咱们的 item

爱游戏平台登录入口具是自界说python字典;操纵规范字典近似的语法,你可以或许或许或许或许拜候它们的字段(便是之前咱们界说的属性) 
 

>>> item = DmozItem()
>>> item['title'] = 'Example title'
>>> item['title']
'Example title'
                  

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
                  
Note

你可以或许或许或许或许找到完全功效的spider在dirbot名目里,一样你可以或许或许或许或许拜候http://github.com/scrapy/dirbot

此刻从头抓取dmoz.org网站:

[dmoz] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
  {'desc': [u' - By David Mertz; Addison Wesley. Book in progress, full text, ASCII format. Asks for feedback. [author website, Gnosis Software, Inc.\n],
  'link': [u'http://gnosis.cx/TPiP/'],
  'title': [u'Text Processing in Python']}
[dmoz] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
  {'desc': [u' - By Sean McGrath; Prentice Hall PTR, 2000, ISBN 0130211192, has CD-ROM. Methods to build XML applications fast, Python tutorial, DOM and SAX, new Pyxie open source XML processing library. [Prentice Hall PTR]\n'],
  'link': [u'http://www.informit.com/store/product.aspx?isbn=0130211192'],
  'title': [u'XML Processing with Python']}
                  


存储抓取的数据

最简略的体例去存储抓取的数据是操纵 ,操纵以下的号令:

 

scrapy crawl dmoz -o items.json -t json
                  

它将会发生一个items.json文件,它包罗一切抓取的items(序列化的 )。

在一些小的名目里(比方咱们的教程爱游戏平台登录入口),那就充足啦。但是,假设你想要履行更多庞杂的抓取items,你可以或许或许或许或许写一个 。 由于在名目爱游戏平台登录入口立的时辰,一个特地用于Item Pipelines的占位符文件已跟着名目一路被爱游戏平台登录入口立,目次在tutorial/pipelines.py。若是你只须要存取这些抓取后的items的话,就不须要去完爱游戏平台登录入口任何的条款管道。