熟練使用Scrapy框架作基本的爬蟲開發

Scrapy-Splash渲染

splash是一個JavaScript渲染服務。它是一個實現了HTTP API的輕量級瀏覽器,splash使用python實現的,同時使用Twisted和QT.html

scrapy-splash 是爲了方便scrapy框架使用splash而進行的封裝。它能與scrapy框架更好的結合,相比較於在python中 使用requests庫或者使用scrapy 的Request對象來講,更爲方便,並且能更好的支持異步。python

原理說明

基於spalsh渲染後HTML,經過配置文件解析,入庫。 提升了效率,一天能夠寫幾十個配置dict,即完成幾十個網站爬蟲的編寫。web

配置文件說明:

{
                "industry_type": "政策",  # 行業類別
                "website_type": "央行",  # 網站/微信公衆號名稱
                "url_type": "中國人民銀行-條法司-規範性文件",  # 網站模塊
                "link": "http://www.pbc.gov.cn/tiaofasi/144941/3581332/index.html",  # 訪問連接
                "article_rows_xpath": '//div[@id="r_con"]//table//tr/td/font[contains(@class, "newslist_style")]',
                # 提取文章列表xpath對象
                "title_xpath": "./a",  # 提取標題
                "title_parse": "./@title",  # 提取標題
                "title_link_xpath": "./a/@href",  # 提取標題連接
                "date_re_switch": "False",  # 是否使用正則提取日期時間
                "date_re_expression": "",  # 日期時間正則表達式
                "date_xpath": "./following-sibling::span[1]",  # 提取日期時間
                "date_parse": "./text()",  # 提取日期時間
                "content": '//*[@class="content"]',  # 正文HTML xpath
                "prefix": "http://www.pbc.gov.cn/",  # link前綴
                "config": "{'use_selenium':'False'}"  # 其餘配置:是否使用selenium(默認使用spalsh)
},複製代碼

製做爬蟲 (spiders/itcastSpider.py)

爬蟲功能要分兩步:正則表達式

1. 爬數據

在當前目錄下輸入命令,將在mySpider/spider目錄下建立一個名爲itcast的爬蟲,並指定爬取域的範圍:express

scrapy genspider itcast "itcast.cn"瀏覽器

打開 mySpider/spider目錄裏的 itcast.py,默認增長了下列代碼:bash

import scrapy
class ItcastSpider(scrapy.Spider):
    name = "itcast"
    allowed_domains = ["itcast.cn"]
    start_urls = (
        'http://www.itcast.cn/',
    )
    def parse(self, response):
        pass複製代碼

其實也能夠由咱們自行建立itcast.py並編寫上面的代碼,只不過使用命令能夠免去編寫固定代碼的麻煩微信

要創建一個Spider, 你必須用scrapy.Spider類建立一個子類,並肯定了三個強制的屬性 和 一個方法。app

name = "" :這個爬蟲的識別名稱,必須是惟一的,在不一樣的爬蟲必須定義不一樣的名字。框架

allow_domains = [] 是搜索的域名範圍,也就是爬蟲的約束區域,規定爬蟲只爬取這個域名下的網頁,不存在的URL會被忽略。

start_urls = () :爬取的URL元祖/列表。爬蟲從這裏開始抓取數據,因此,第一次下載的數據將會從這些urls開始。其餘子URL將會從這些起始URL中繼承性生成。

parse(self, response) :解析的方法,每一個初始URL完成下載後將被調用,調用的時候傳入從每個URL傳回的Response對象來做爲惟一參數,主要做用以下:

負責解析返回的網頁數據(response.body),提取結構化數據(生成item)

生成須要下一頁的URL請求。

將start_urls的值修改成須要爬取的第一個url

start_urls = ("http://www.itcast.cn/channel/teacher.shtml",)複製代碼

修改parse()方法

def parse(self, response):
    filename = "teacher.html"
    open(filename, 'w').write(response.body)複製代碼

而後運行一下看看,在mySpider目錄下執行:

scrapy crawl itcast複製代碼

是的,就是 itcast,看上面代碼,它是 ItcastSpider 類的 name 屬性,也就是使用 scrapy genspider命令的惟一爬蟲名。

運行以後,若是打印的日誌出現 [scrapy] INFO: Spider closed (finished),表明執行完成。 以後當前文件夾中就出現了一個 teacher.html 文件,裏面就是咱們剛剛要爬取的網頁的所有源代碼信息。

**注意,Python2.x默認編碼環境是ASCII,當和取回的數據編碼格式不一致時,可能會形成亂碼;

咱們能夠指定保存內容的編碼格式,通常狀況下,咱們能夠在代碼最上方添加:**

import sys
reload(sys)
sys.setdefaultencoding("utf-8")複製代碼

這三行代碼是Python2.x裏解決中文編碼的萬能鑰匙,通過這麼多年的吐槽後Python3學乖了,默認編碼是Unicode了...(祝你們早日擁抱Python3)

2. 取數據

爬取整個網頁完畢,接下來的就是的取過程了,首先觀察頁面源碼:

<div class="li_txt">
    <h3>  xxx  </h3>
    <h4> xxxxx </h4>
    <p> xxxxxxxx </p>複製代碼

是否是一目瞭然?直接上XPath開始提取數據吧。

咱們以前在mySpider/items.py 裏定義了一個ItcastItem類。 這裏引入進來

from mySpider.items import ItcastItem複製代碼

而後將咱們獲得的數據封裝到一個 ItcastItem 對象中,能夠保存每一個老師的屬性:

from mySpider.items import ItcastItem
def parse(self, response):
    #open("teacher.html","wb").write(response.body).close()
    # 存放老師信息的集合
    items = []
    for each in response.xpath("//div[@class='li_txt']"):
        # 將咱們獲得的數據封裝到一個 `ItcastItem` 對象
        item = ItcastItem()
        #extract()方法返回的都是unicode字符串
        name = each.xpath("h3/text()").extract()
        title = each.xpath("h4/text()").extract()
        info = each.xpath("p/text()").extract()
        #xpath返回的是包含一個元素的列表
        item['name'] = name[0]
        item['title'] = title[0]
        item['info'] = info[0]
        items.append(item)
    # 直接返回最後數據
    return items
咱們暫時先不處理管道,後面會詳細介紹。
保存數據複製代碼

如今咱們須要給咱們的scrapy添加代理中間件

class ProxyMiddleware(object):
      def process_request(self, request, spider):
      request.meta['splash']['args']['proxy'] = proxyServer
      request.headers["Proxy-Authorization"] = proxyAuth複製代碼

使用億牛雲爬蟲代理經過scrapy-splash爬蟲就能夠愉快的抓取數據了

相關文章
相關標籤/搜索