最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python Scrapy爬蟲框架的使用

 更新時間:2021年01月21日 10:37:37   作者:測神  
這篇文章主要介紹了python Scrapy爬蟲框架的使用,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

  導(dǎo)讀:如何使用scrapy框架實(shí)現(xiàn)爬蟲的4步曲?什么是CrawSpider模板?如何設(shè)置下載中間件?如何實(shí)現(xiàn)Scrapyd遠(yuǎn)程部署和監(jiān)控?想要了解更多,下面讓我們來看一下如何具體實(shí)現(xiàn)吧!

Scrapy安裝(mac)

pip install scrapy

注意:不要使用commandlinetools自帶的python進(jìn)行安裝,不然可能報架構(gòu)錯誤;用brew下載的python進(jìn)行安裝。

Scrapy實(shí)現(xiàn)爬蟲

新建爬蟲

scrapy startproject demoSpider,demoSpider為項目名。

確定目標(biāo)

編寫items.py,如添加目標(biāo)字段:person = scrapy.Field()

制作爬蟲

scrapy genspider demo "baidu.com",創(chuàng)建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)

運(yùn)行爬蟲,看看效果:scrapy crawl demo

有了保存的頁面后(可注釋掉或刪掉保存頁面的代碼),根據(jù)頁面結(jié)構(gòu)提取所需數(shù)據(jù),一般用xpath表達(dá)式,如:

def parse(self, response):
  for _ in response.xpath("http://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

保存數(shù)據(jù):scrapy crawl demo -o demo.json(以下格式都行:jsonl,jsonl,csv,xml)

注:該過程在取值中經(jīng)常需要頁面調(diào)試,使用scrapy shell(最好先安裝ipython,有語法提示),調(diào)試好了再放到代碼里,如:

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

處理內(nèi)容

pipline常用來存儲內(nèi)容,pipline.py中必須實(shí)現(xiàn)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,看看當(dāng)前目錄是否生成demo.json

CrawlSpiders

CrawlSpider是spider的派生類,為了從爬取的網(wǎng)頁中獲取link并繼續(xù)爬取。

快速創(chuàng)建 CrawlSpider模板:scrapy genspider -t crawl baidu baidu.com

Rule類制定了爬取規(guī)則;LinkExtractors類為了提取鏈接,如:

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

from scrapy.linkextractors import LinkExtractor

# 注意轉(zhuǎn)義字符&
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方法進(jìn)行分析;并跟進(jìn)鏈接(沒有callback意味著follow默認(rèn)為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

該方法用來發(fā)送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

防止爬蟲被反策略

設(shè)置隨機(jī)User-Agent

禁用Cookies,可以通過COOKIES_ENABLED 控制 CookiesMiddleware 開啟或關(guān)閉

設(shè)置延遲下載降低頻率

使用谷歌/百度等搜索引擎服務(wù)器頁面緩存獲取頁面數(shù)據(jù)

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

使用cralera(專用于爬蟲的代理組件),配置中間件后請求都是通過crawlera發(fā)出的

設(shè)置下載中間件——Downloader Middlewares

鍵為中間件類的路徑,值為其中間件的順序(order)

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

當(dāng)請求通過下載中間件時,process_request方法被調(diào)用;當(dāng)下載中間件完成請求后傳遞響應(yīng)給引擎時process_response方法被調(diào)用。

在settings.py同級目錄下創(chuàng)建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, request, 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']

與代理服務(wù)器連接需要使用base64編碼,如果有需要身份驗證的話還需要加上授權(quán)信息,

修改settings.py配置USER_AGENTS和PROXIES

免費(fèi)代理IP上網(wǎng)搜,或購買可用的私密代理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

# 設(shè)置下載延遲
DOWNLOAD_DELAY = 3

# 添加自己編寫的下載中間件
DOWNLOADER_MIDDLEWARES = {
  #'mySpider.middlewares.MyCustomDownloaderMiddleware': 543,
  'mySpider.middlewares.RandomUserAgent': 1,
  'mySpider.middlewares.ProxyMiddleware': 100
}

Scrapyd - 爬蟲的遠(yuǎn)程部署和監(jiān)控

安裝Scrapyd

sudo pip install scrapyd
sudo pip install scrapyd-client

修改scrapyd的配置文件

啟用scrapyd配置,在deploy后面指定當(dāng)前項目的Scrapyd配置名,配置Scrapyd服務(wù)的ip和port,以及當(dāng)前項目的項目名,如:

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]    

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

# 需要部署和監(jiān)控的Scrapy項目名
project = Demo

通過Scrapyd客戶端工具掛載項目

指令:scrapyd-deploy Scrapyd_Demo -p Demo

scrapyd-deploy 是客戶端命令,參數(shù)是 Scrapyd配置名,以及 -p 指定項目名

遠(yuǎn)程部署和停止爬蟲

部署: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爬蟲框架的使用的詳細(xì)內(nèi)容,更多關(guān)于python Scrapy爬蟲框架的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python中pygame安裝不成功的解決辦法

    python中pygame安裝不成功的解決辦法

    盡管網(wǎng)上搜到許多篇關(guān)于pycharm如何安裝pygame庫,但是跟著要求做還是安裝失敗,下面這篇文章主要給大家介紹了關(guān)于python中pygame安裝不成功的解決辦法,需要的朋友可以參考下
    2023-05-05
  • 使用Python在Excel工作表中創(chuàng)建數(shù)據(jù)透視表的方法

    使用Python在Excel工作表中創(chuàng)建數(shù)據(jù)透視表的方法

    在數(shù)據(jù)處理和分析工作中,Excel作為一個廣泛使用的工具,提供了強(qiáng)大的功能來管理和解析數(shù)據(jù),當(dāng)面對大量復(fù)雜的數(shù)據(jù)集時,為了更高效地總結(jié)、分析和展示數(shù)據(jù),創(chuàng)建數(shù)據(jù)透視表成為一種不可或缺的方法,本文將介紹如何使用Python在Excel工作表中創(chuàng)建數(shù)據(jù)透視表
    2025-01-01
  • python項目對接釘釘SDK的實(shí)現(xiàn)

    python項目對接釘釘SDK的實(shí)現(xiàn)

    這篇文章主要介紹了python項目對接釘釘SDK的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • python中virtualenvwrapper安裝與使用

    python中virtualenvwrapper安裝與使用

    本篇文章給大家介紹了python環(huán)境神器virtualenvwrapper安裝與使用,對此有需要的朋友可以跟著操作一下。
    2018-05-05
  • Python之np.where()如何替換缺失值

    Python之np.where()如何替換缺失值

    這篇文章主要介紹了Python中的np.where()如何替換缺失值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python空值填充為無的實(shí)現(xiàn)方法

    python空值填充為無的實(shí)現(xiàn)方法

    我們經(jīng)常會遇到數(shù)據(jù)集中存在空值的情況,本文主要介紹了python空值填充為無的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • Python實(shí)現(xiàn)圖像去噪方式(中值去噪和均值去噪)

    Python實(shí)現(xiàn)圖像去噪方式(中值去噪和均值去噪)

    今天小編就為大家分享一篇Python實(shí)現(xiàn)圖像去噪方式(中值去噪和均值去噪),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python的迭代器與生成器實(shí)例詳解

    python的迭代器與生成器實(shí)例詳解

    這篇文章主要介紹了python的迭代器與生成器實(shí)例詳解,需要的朋友可以參考下
    2014-07-07
  • python異常的傳遞知識點(diǎn)總結(jié)

    python異常的傳遞知識點(diǎn)總結(jié)

    在本篇文章里小編給大家整理的是一篇關(guān)于python異常的傳遞知識點(diǎn)總結(jié),有興趣的朋友們可以學(xué)習(xí)下。
    2021-06-06
  • Python網(wǎng)絡(luò)編程之socket與socketserver

    Python網(wǎng)絡(luò)編程之socket與socketserver

    這篇文章介紹了Python網(wǎng)絡(luò)編程之socket與socketserver,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05

最新評論

库车县| 娱乐| 潮州市| 五指山市| 天津市| 莫力| 随州市| 岚皋县| 虞城县| 汝城县| 浦东新区| 大宁县| 开江县| 磐安县| 张掖市| 阿克| 威信县| 宜城市| 集安市| 微山县| 广饶县| 通化市| 仙游县| 大安市| 崇信县| 德安县| 宽城| 饶平县| 康保县| 大冶市| 靖宇县| 石家庄市| 宜黄县| 阳谷县| 苍山县| 弥勒县| 隆化县| 上栗县| 万荣县| 潮州市| 清丰县|