1. 程式人生 > 程式設計 >python Scrapy爬蟲框架的使用

python Scrapy爬蟲框架的使用

  導讀:如何使用scrapy框架實現爬蟲的4步曲?什麼是CrawSpider模板?如何設定下載中介軟體?如何實現Scrapyd遠端部署和監控?想要了解更多,下面讓我們來看一下如何具體實現吧!

Scrapy安裝(mac)

pip install scrapy

注意:不要使用commandlinetools自帶的python進行安裝,不然可能報架構錯誤;用brew下載的python進行安裝。

Scrapy實現爬蟲

新建爬蟲

scrapy startproject demoSpider,demoSpider為專案名。

確定目標

編寫items.py,如新增目標欄位:person = scrapy.Field()

製作爬蟲

scrapy genspider demo "baidu.com",建立demo爬蟲檔案,指定爬取域。

修改demo.py裡的start_urls的地址為自己想爬取的地址如:https://www.cnblogs.com/teark/

隨意修改parse()方法,如儲存所爬取的頁面,可以這樣:

def parse(self,response):
  with open("teark.html","w") as f:
    f.write(response.text)

執行爬蟲,看看效果:scrapy crawl demo

有了儲存的頁面後(可註釋掉或刪掉儲存頁面的程式碼),根據頁面結構提取所需資料,一般用xpath表示式,如:

def parse(self,response):
  for _ in response.xpath("//div[@class='teark_article']"):
    item = ItcastItem()
    title = each.xpath("h3/text()").extract()
    content = each.xpath("p/text()").extract()
    item['title'] = title[0]
    item['content'] = content[0]
    yield item

儲存資料:scrapy crawl demo -o demo.json(以下格式都行:jsonl,jsonl,csv,xml)

注:該過程在取值中經常需要頁面除錯,使用scrapy shell(最好先安裝ipython,有語法提示),除錯好了再放到程式碼裡,如:

scrapy shell "https://www.cnblogs.com/teark/"
response.xpath('//*[@class="even"]')
print site[0].xpath('./td[2]/text()').extract()[0]

處理內容

pipline常用來儲存內容,pipline.py中必須實現process_item()方法,該方法必須返回Item物件,如:

import json

class ItcastJsonPipeline(object):

  def __init__(self):
    self.file = open('demo.json','wb')

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

  def close_spider(self,spider):
    self.file.close()

在settings.py中新增ITEM_PIPELINES配置,如:

ITEM_PIPELINES = {
  "demoSpider.pipelines.DemoJsonPipeline":300
}

重新啟動爬蟲:scrapy crawl demo,看看當前目錄是否生成demo.json

CrawlSpiders

CrawlSpider是spider的派生類,為了從爬取的網頁中獲取link並繼續爬取。

快速建立 CrawlSpider模板:scrapy genspider -t crawl baidu baidu.com

Rule類制定了爬取規則;LinkExtractors類為了提取連結,如:

scrapy shell "http://teark.com/article.php?&start=0#a"

from scrapy.linkextractors import LinkExtractor

# 注意轉義字元&
page_lx = LinkExtractor(allow=('comment.php?\&start=\d+'))
page_lx.extract_links(response)

測試完後就知道了allow和rules了,修改spider程式碼:

#提取匹配 'http://teark.com/article.php?&start=\d+'的連結
page_lx = LinkExtractor(allow = ('start=\d+'))

rules = [
  #提取匹配,並使用spider的parse方法進行分析;並跟進連結(沒有callback意味著follow預設為True)
  Rule(page_lx,callback = 'parseContent',follow = True)
]

注:callback 千萬不能寫 'parse'

Logging

新增日誌功能:settings.py中新增如下:

LOG_FILE = "DemoSpider.log"

# 還有CRITICAL,ERROR,WARNING DEBUG等級別
LOG_LEVEL = "INFO"

FormRequest

該方法用來發送POST請求,在spider.py中如下:

def start_requests(self):
    url = 'http://www.renren.com/PLogin.do'
    yield scrapy.FormRequest(
      url = url,formdata = {"email" : "teark@9133***34.com","password" : "**teark**"},callback = self.parse_page
    )

模擬登陸:

import scrapy

class LoginSpider(scrapy.Spider):
  name = 'demo.com'
  start_urls = ['http://www.demo.com/users/login.php']    

  def parse(self,response):
    return scrapy.FormRequest.from_response(
      response,formdata={'username': 'teark','password': '***'},callback=self.after_login
    )

  def after_login(self,response):
    # 檢查登陸成功還是失敗
    if "authentication failed" in response.body:
      self.log("Login failed",level=log.ERROR)
      return

Downloader Middlewares

防止爬蟲被反策略

設定隨機User-Agent

禁用Cookies,可以通過COOKIES_ENABLED控制 CookiesMiddleware 開啟或關閉

設定延遲下載降低頻率

使用谷歌/百度等搜尋引擎伺服器頁面快取獲取頁面資料

使用IP地址池——VPN和代理IP

使用cralera(專用於爬蟲的代理元件),配置中介軟體後請求都是通過crawlera發出的

設定下載中介軟體——Downloader Middlewares

鍵為中介軟體類的路徑,值為其中介軟體的順序(order)

DOWNLOADER_MIDDLEWARES = {
  'mySpider.middlewares.MyDownloaderMiddleware': 543,}

當請求通過下載中介軟體時,process_request方法被呼叫;當下載中介軟體完成請求後傳遞響應給引擎時process_response方法被呼叫。

在settings.py同級目錄下建立middlewares.py檔案,如:

import random
import base64
from settings import USER_AGENTS
from settings import PROXIES


class RandomUserAgent(object):
  def process_request(self,request,spider):
    useragent = random.choice(USER_AGENTS)
    request.headers.setdefault("User-Agent",useragent)

class RandomProxy(object):
  def process_request(self,spider):
    proxy = random.choice(PROXIES)
    if proxy['user_passwd'] is None:
      request.meta['proxy'] = "http://" + proxy['ip_port']
    else:
      base64_userpasswd = base64.b64encode(proxy['user_passwd'])
      request.headers['Proxy-Authorization'] = 'Basic ' + base64_userpasswd
      request.meta['proxy'] = "http://" + proxy['ip_port']

與代理伺服器連線需要使用base64編碼,如果有需要身份驗證的話還需要加上授權資訊,

修改settings.py配置USER_AGENTS和PROXIES

免費代理IP上網搜,或購買可用的私密代理IP

USER_AGENTS = ["Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0","Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
  ]

PROXIES = [
  {'ip_port': '111.8.60.9:8123','user_passwd': 'user1:pass1'},  {'ip_port': '101.71.27.120:80','user_passwd': 'user2:pass2'},  {'ip_port': '122.96.59.104:80','user_passwd': 'user3:pass3'},  ]

# 禁用cookies
COOKIES_ENABLED = False

# 設定下載延遲
DOWNLOAD_DELAY = 3

# 新增自己編寫的下載中介軟體
DOWNLOADER_MIDDLEWARES = {
  #'mySpider.middlewares.MyCustomDownloaderMiddleware': 543,'mySpider.middlewares.RandomUserAgent': 1,'mySpider.middlewares.ProxyMiddleware': 100
}

Scrapyd - 爬蟲的遠端部署和監控

安裝Scrapyd

sudo pip install scrapyd
sudo pip install scrapyd-client

修改scrapyd的配置檔案

啟用scrapyd配置,在deploy後面指定當前專案的Scrapyd配置名,配置Scrapyd服務的ip和port,以及當前專案的專案名,如:

sudo vi /usr/local/lib/python3.8.6/site-packages/scrapyd/default_scrapyd.conf
# scrapy專案的settings檔案位置,不用改動
[settings]
default = Demo.settings

# Scrapyd_Tencent是配置名
[deploy:Scrapyd_Demo]    

# 若是本機Scrapyd服務部署,則使用localhost即可否則使用服務主機的ip
url = http://localhost:6800/  

# 需要部署和監控的Scrapy專案名
project = Demo

通過Scrapyd客戶端工具掛載專案

指令:scrapyd-deploy Scrapyd_Demo -p Demo

scrapyd-deploy 是客戶端命令,引數是 Scrapyd配置名,以及 -p 指定專案名

遠端部署和停止爬蟲

部署:curl http://localhost:6800/schedule.json -d project=Demo -d spider=demo

停止:curl http://localhost:6800/cancel.json -d project=Demo -d job=iundsw....

注:爬蟲啟動成功後,會生成job值,停止爬蟲時需要通過job值停止。

以上就是python Scrapy爬蟲框架的使用的詳細內容,更多關於python Scrapy爬蟲框架的資料請關注我們其它相關文章!