天天看點

Scrapy爬取makepolo網站資料深入詳解一、Scrapy爬蟲使用概括步驟如下二、Scrapy爬蟲使用詳解三、scrapy爬取馬可波羅網站思路詳解:四、小結

題記

之前對爬蟲隻是概念了解多,實戰少。知道網上流行的有号稱免費的八爪魚等(實際導出資料收費)。

大緻知道,所有爬蟲要實作爬取網頁資訊,需要定義正則比對規則。

這次,項目緊急,才知道“書到用時方恨少”,有限的理論知識是遠遠不夠的。

首先,Google搜尋了不同語言實作的開源爬蟲,C++、Java、Python、Ruby等。由于C++寫的過于龐大,Java代碼不太熟。

Python雖也不熟悉,但看起來不費勁,并且,Python在爬蟲領域有很大優勢,值得深入研究。

其次,對比選型Python爬蟲開源實作,主要包括:Scrapy、PyRailgun等。

最後,定選型。對比國内寫的PyRailgun和Scrapy,不論從易用性、Git關注度、廣泛性。Scrapy都有明顯優勢,研究的人非常多。

是以,本文從Scrapy爬取makepolo企業資料說起。

一、Scrapy爬蟲使用概括步驟如下

1、建立新的Scrapy工程;

2、定義需要提取的Items;

3、寫爬蟲Spider用于爬取設定的站點,提取Items;

4、寫Item Pipeline(管道),用來存儲提取的Items。

二、Scrapy爬蟲使用詳解

前提:

1)爬蟲目标網站:

http://company.makepolo.com/shandong/

2)待爬取内容:以清單形式呈現的公司名稱。

3)裝置:centos 6.8

4)安裝Scrapy參考步驟(目前最好用、快捷版本):

https://www.douban.com/group/topic/51645204/

第1步:建立馬可波羅網站爬蟲工程。

[root@yang scrapy_testing]# scrapy startproject scrapy_makepolo 
New Scrapy project ‘scrapy_makepolo’, using template directory ‘/usr/local/lib/python2.7/site-packages/scrapy/templates/project’, created in: 
/home/yang/spider_ycy/scrapy_testing/scrapy_makepolo

You can start your first spider with: 
cd scrapy_makepolo 
scrapy genspider example example.com           

以上内容是提示資訊,也就是說建立完畢以後,會形成如下樹結構的工程路徑:

[root@yang scrapy_testing]# tree scrapy_makepolo/ 
scrapy_makepolo/ 
├── scrapy.cfg ‘#工程的配置檔案 
└── scrapy_makepolo ‘#工程的Python模型,需要在此處導入代碼 
├── init.py 
├── init.pyc 
├── init.pyo 
├── items.py ‘#工程 Items檔案 
├── pipelines.py ‘#工程 管道檔案 
├── settings.py ‘#工程 配置檔案 
├── settings.pyc 
└── spiders ‘#放置爬蟲的路徑 
├── example.py 
├── init.py 
├── init.pyc 
└── init.pyo           

第2步:定義你的Item

在items.py檔案裡定義在抓取網頁内容中抽象出來的資料結構的定義,由于這裡需要公司名稱一個字段,是以,定義的Item結構如下:

[root@laoyang scrapy_makepolo]# cat items.py

'# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

from scrapy import Item,Field

class ScrapyMakepoloItem(Item):
  # define the fields for your item here like:
  # name = scrapy.Field()
  companyName = Field() #公司名稱
  pass
You have new mail in /var/spool/mail/root           

第3步:定義爬蟲規則等

1.Spiders是定義的類,scrapy用于爬取指定域名或者域名組資訊。

2.需要定義用于下載下傳的初始化URL清單,需要定義跟蹤清單和解析頁面内容以提取items的規則。

3.為了建立Spider,你需要定義scrapy.Spider子類,并需要定義如下的一些屬性值:

1)name:用于辨別Spider。該名稱必須確定唯一性。

2)start_urls:爬蟲需要爬取的起點Urls清單。

3)parse()方法:Spider方法,每個頁面下載下傳的Response對象是該方法的唯一參數。

該方法作用:解析response資料,并提取爬取的資料。

路徑如下:

/home/yangcy/spider_ycy/scrapy_testing/scrapy_makepolo/scrapy_makepolo/spiders
[root@laoyang spiders]# ls -al
總用量 24
drwxr-xr-x 2 root root 4096 9月 8 14:20 .
drwxr-xr-x 3 root root 4096 9月 8 14:35 ..
-rw-r--r-- 1 root root 240 9月 8 14:20 example.py
-rw-r--r-- 1 root root 161 9月 7 15:50 __init__.py
-rw-r--r-- 1 root root 177 9月 8 14:20 __init__.pyc
-rw-r--r-- 1 root root 177 9月 7 16:04 __init__.pyo           

将example.py改名為 ScrapyMakepolo.py,并做如下的規則定義。

[root@laoyang spiders]# cat ScrapyMakepolo.py
# -*- coding: utf-8 -*-

from scrapy.spiders import Spider, Rule
from scrapy.selector import Selector
from scrapy_makepolo.items import ScrapyMakepoloItem
from scrapy.linkextractors import LinkExtractor
import re
from scrapy.spiders import CrawlSpider

class ScrapyMakepoloSpider(CrawlSpider):
  name = "MakepoloSpider"

  allowed_domains = ["company.makepolo.com"]
  start_urls = [
  "http://company.makepolo.com/shandong/1",
  ]

  rules = (
  Rule(LinkExtractor(allow=('shandong/([\d]+)', ),),callback='parse_item',follow=True),
  )

  def parse_item(self, response):
  sel = response.selector
  posts = sel.xpath('//div[@class="colist"]/div[@class="colist_item"]')
  items = []
  for p in posts:
  item = ScrapyMakepoloItem()
  companyName = p.xpath('h2[@class="colist_item_title"]/a/text()').extract_first()
  item["companyName"] = (companyName is not None and [companyName.encode("utf-8")] or [""])[0]
  items.append(item)

  return items           

第4步: 寫Item Pipeline(管道),用來存儲提取的Items。

将結果輸出到item.json檔案中。

[root@laoyang scrapy_makepolo]# cat pipelines.py
# -*- coding: utf-8 -*-

# 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

class ScrapyMakepoloPipeline(object):
  def __init__(self):
  self.file = open("item.json", "w+")

  def process_item(self, item, spider):
  record = json.dumps(dict(item), ensure_ascii=False)+"\n"
  self.file.write(record)
  return item           

第5步:修改配置setting.py.

主要修改: ITEM_PIPELINES 為pipelines.py 中定義的管道接口類ScrapyMakepoloPipeline。

[root@laoyang scrapy_makepolo]# cat settings.py
# -*- coding: utf-8 -*-

# Scrapy settings for scrapy_makepolo project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
# http://doc.scrapy.org/en/latest/topics/settings.html
# http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
# http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html

BOT_NAME = 'scrapy_makepolo'

SPIDER_MODULES = ['scrapy_makepolo.spiders']
NEWSPIDER_MODULE = 'scrapy_makepolo.spiders'

# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
  'scrapy_makepolo.pipelines.ScrapyMakepoloPipeline': 1,
}           

至此,所有配置完畢。

第6步:執行。

scrapy crawl MakepoloSpider            

其中:

MakepoloSpider為ScrapyMakepolo.py中的name定義。           

執行結果如下所示:

[root@laoyang scrapy_makepolo]# tail -f item.json
{"companyName": "章丘市宇龍機械有限公司"}
{"companyName": "濟南松嶽機器有限責任公司"}
{"companyName": "山東雙一集團銷售部"}
{"companyName": "山東景盛泉酒業"}
{"companyName": "郓城皮家燒雞有限公司"}
{"companyName": "膠州市煜德手機通訊服務部"}
{"companyName": "甯津縣天福建築新材料有限公司"}
{"companyName": "聊城市建興金屬材料有限公司"}
{"companyName": "山東益母草有限公司"}
..........           

去重後結果數:

[root@laoyang scrapy_cnblogs-master]# cat sd_mkbl_uniq.txt | wc -l
9521           

三、scrapy爬取馬可波羅網站思路詳解:

步驟1:進入到馬可波羅山東企業首頁:

步驟2:檢視其頁面結構,知道其支援通過下一頁按鈕進入下一頁。

第1頁連結:

http://company.makepolo.com/shandong/1

第2頁連結:

http://company.makepolo.com/shandong/2

……

第1000頁連結:

http://company.makepolo.com/shandong/1000

由此看出網站以序号作為參數來表示頁數,這樣看來爬蟲的規則就比較簡單實作。

Scrapy爬取makepolo網站資料深入詳解一、Scrapy爬蟲使用概括步驟如下二、Scrapy爬蟲使用詳解三、scrapy爬取馬可波羅網站思路詳解:四、小結

步驟3:定義爬蟲規則。

‘shandong/([d]+)’ ,這個就是爬蟲的規則,數字為對應數字的頁面,這樣無論有多少頁都可以通過周遊規則周遊到。

1)如果頁面數量很少時:可以在start_urls清單中,将要爬取的頁面都列出來,

2)如果頁面數量很多時:要繼承CrawlSpider爬蟲類,使用Spider就不行了。(該問題排查了30分鐘以上,才解決)

在規則定義(rules)時,如果要對爬取的網頁進行處理,而不是簡單的需要Url清單堆砌。

這時,需要定義一個回調函數,在爬取到符合條件的網頁時調用,并且設定follow=Ture,定義如下:

rules = (
  Rule(LinkExtractor(allow=('shandong/([\d]+)', ),),callback='parse_item',follow=True),
  )           

四、小結

想融彙貫通Scrapy進行網絡資料分析,個人感覺:網頁資料爬取正則标示,xpath解析非常重要。這也是我接下來要深入研究的重點。

也想進一步就其他網站做進一步深入爬取、分析。

參考

[1]

http://doc.scrapy.org/en/latest/intro/tutorial.html http://www.cnblogs.com/rwxwsblog/p/4557123.html

[2]學習python:

https://learnpythonthehardway.org/book/

[3]

http://www.pycoding.com/2016/03/14/scrapy-04.html

作者:銘毅天下

轉載請标明出處,原文位址:

http://blog.csdn.net/laoyang360/article/details/52491147