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)
},複製代碼
爬蟲功能要分兩步:正則表達式
在當前目錄下輸入命令,將在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)
爬取整個網頁完畢,接下來的就是的取過程了,首先觀察頁面源碼:
<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
咱們暫時先不處理管道,後面會詳細介紹。
保存數據複製代碼
class ProxyMiddleware(object):
def process_request(self, request, spider):
request.meta['splash']['args']['proxy'] = proxyServer
request.headers["Proxy-Authorization"] = proxyAuth複製代碼
使用億牛雲爬蟲代理經過scrapy-splash爬蟲就能夠愉快的抓取數據了