国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python圖片爬取方法總結

edagarli / 2054人閱讀

摘要:當項目進入,組內的將被的調度器和下載器這意味著調度器和下載器的中間件可以復用安排下載,當優先級更高,會在其他頁面被抓取前處理。這個組將包含一個字典列表,其中包括下載文件的信息,比如下載路徑源抓取地址從組獲得和圖片的校驗碼。

1. 最常見爬取圖片方法

對于圖片爬取,最容易想到的是通過urllib庫或者requests庫實現。具體兩種方法的實現如下:

1.1 urllib

使用urllib.request.urlretrieve方法,通過圖片url和存儲的名稱完成下載。

"""
Signature: request.urlretrieve(url, filename=None, reporthook=None, data=None)
Docstring:
Retrieve a URL into a temporary location on disk.

Requires a URL argument. If a filename is passed, it is used as
the temporary file location. The reporthook argument should be
a callable that accepts a block number, a read size, and the
total file size of the URL target. The data argument should be
valid URL encoded data.

If a filename is passed and the URL points to a local resource,
the result is a copy from local file to new file.

Returns a tuple containing the path to the newly created
data file as well as the resulting HTTPMessage object.
File:      ~/anaconda/lib/python3.6/urllib/request.py
Type:      function
"""

參數 finename 指定了保存本地路徑(如果參數未指定,urllib會生成一個臨時文件保存數據。)

參數 reporthook 是一個回調函數,當連接上服務器、以及相應的數據塊傳輸完畢時會觸發該回調,我們可以利用這個回調函數來顯示當前的下載進度。

參數 data 指 post 到服務器的數據,該方法返回一個包含兩個元素的(filename, headers)元組,filename 表示保存到本地的路徑,header 表示服務器的響應頭。

使用示例:

request.urlretrieve("https://img3.doubanio.com/view/photo/photo/public/p454345512.jpg", "kids.jpg")

但很有可能返回403錯誤(Forbidden),如:http://www.qnong.com.cn/uploa...。Stack Overflow指出原因:This website is blocking the user-agent used by urllib, so you need to change it in your request.

給urlretrieve加上User-Agent還挺麻煩,方法如下:

import urllib

opener = request.build_opener()
headers = ("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:53.0) Gecko/20100101 Firefox/53.0")
opener.addheaders = [headers]
request.install_opener(opener)
request.urlretrieve("http://www.qnong.com.cn/uploadfile/2016/0416/20160416101815887.jpg", "./dog.jpg")
1.2 requests

使用requests.get()獲取圖片,但要將參數stream設為True

import requests

req = requests.get("http://www.qnong.com.cn/uploadfile/2016/0416/20160416101815887.jpg", stream=True)

with open("dog.jpg", "wb") as wr:
    for chunk in req.iter_content(chunk_size=1024):
        if chunk:
            wr.write(chunk)
            wr.flush()

requests添加User-Agent也很方便,使用headers參數即可。


2. Scrapy 支持的方法 2.1 ImagesPipeline

Scrapy 自帶 ImagesPipeline 和 FilePipeline 用于圖片和文件下載,最簡單使用 ImagesPipeline 只需要在 settings 中配置。

# settings.py
ITEM_PIPELINES = {
    "scrapy.pipelines.images.ImagesPipeline": 500
}

IMAGES_STORE = "pictures"  # 圖片存儲目錄
IMAGES_MIN_HEIGHT = 400  # 小于600*400的圖片過濾
IMAGES_MIN_WIDTH = 600
# items.py
import scrapy

class PictureItem(scrapy.Item):
    image_urls = scrapy.Field()
# myspider.py
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


from ..items import BeePicture

class PicSpider(CrawlSpider):
    name = "pic"
    allowed_domains = ["qnong.com.cn"]
    start_urls = ["http://www.qnong.com.cn/"]

    rules = (
        Rule(LinkExtractor(allow=r".*?", restrict_xpaths=("http://a[@href]")), callback="parse_item", follow=True),
    )

    def parse_item(self, response):
        for img_url in response.xpath("http://img/@src").extract():
            item = PictureItem()
            item["image_urls"] = [response.urljoin(img_url)]
            yield item
2.2 自定義 Pipeline

默認情況下,使用ImagePipeline組件下載圖片的時候,圖片名稱是以圖片URL的SHA1值進行保存的。

如:
圖片URL: http://www.example.com/image.jpg
SHA1結果:3afec3b4765f8f0a07b78f98c07b83f013567a0a
則圖片名稱:3afec3b4765f8f0a07b78f98c07b83f013567a0a.jpg

想要以自定義圖片文件名需要重寫 ImagesPipeline 的file_path方法。參考:https://doc.scrapy.org/en/lat...。

# settings.py
ITEM_PIPELINES = {
    "qnong.pipelines.MyImagesPipeline": 500,
}
# items.py
import scrapy

class PictureItem(scrapy.Item):
    image_urls = scrapy.Field()
    images = scrapy.Field()
    image_paths = scrapy.Field()
# myspider.py
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


from ..items import BeePicture

class PicSpider(CrawlSpider):
    name = "pic"
    allowed_domains = ["qnong.com.cn"]
    start_urls = ["http://www.qnong.com.cn/"]

    rules = (
        Rule(LinkExtractor(allow=r".*?", restrict_xpaths=("http://a[@href]")), callback="parse_item", follow=True),
    )

    def parse_item(self, response):
        for img_url in response.xpath("http://img/@src").extract():
            item = PictureItem()
            item["image_urls"] = [response.urljoin(img_url)]
            yield item
# pipelines.py
from scrapy.exceptions import DropItem
from scrapy.pipelines.images import ImagesPipeline
import scrapy

class MyImagesPipeline(ImagesPipeline):
    def get_media_requests(self, item, info):
        for img_url in item["image_urls"]:
            yield scrapy.Request(img_url)

    def item_completed(self, results, item, info):
        image_paths = [x["path"] for ok, x in results if ok]
        if not image_paths:
            raise DropItem("Item contains no images")
        item["image_paths"] = image_paths
        return item

    def file_path(self, request, response=None, info=None):
        image_guid = request.url.split("/")[-1]
        return "full/%s" % (image_guid)
2.3 FilesPipeline 和 ImagesPipeline 工作流程

FilesPipeline

在一個爬蟲里,你抓取一個項目,把其中圖片的URL放入 file_urls 組內。

項目從爬蟲內返回,進入項目管道。

當項目進入 FilesPipeline,file_urls 組內的 URLs 將被 Scrapy 的調度器和下載器(這意味著調度器和下載器的中間件可以復用)安排下載,當優先級更高,會在其他頁面被抓取前處理。項目會在這個特定的管道階段保持“locker”的狀態,直到完成文件的下載(或者由于某些原因未完成下載)。

當文件下載完后,另一個字段(files)將被更新到結構中。這個組將包含一個字典列表,其中包括下載文件的信息,比如下載路徑、源抓取地址(從 file_urls 組獲得)和圖片的校驗碼(checksum)。 files 列表中的文件順序將和源 file_urls 組保持一致。如果某個圖片下載失敗,將會記錄下錯誤信息,圖片也不會出現在 files 組中。

ImagesPipeline

在一個爬蟲里,你抓取一個項目,把其中圖片的 URL 放入 images_urls 組內。

項目從爬蟲內返回,進入項目管道。

當項目進入 Imagespipeline,images_urls 組內的URLs將被Scrapy的調度器和下載器(這意味著調度器和下載器的中間件可以復用)安排下載,當優先級更高,會在其他頁面被抓取前處理。項目會在這個特定的管道階段保持“locker”的狀態,直到完成文件的下載(或者由于某些原因未完成下載)。

當文件下載完后,另一個字段(images)將被更新到結構中。這個組將包含一個字典列表,其中包括下載文件的信息,比如下載路徑、源抓取地址(從 images_urls 組獲得)和圖片的校驗碼(checksum)。 images 列表中的文件順序將和源 images_urls 組保持一致。如果某個圖片下載失敗,將會記錄下錯誤信息,圖片也不會出現在 images 組中。

Scrapy 不僅可以下載圖片,還可以生成指定大小的縮略圖。
Pillow 是用來生成縮略圖,并將圖片歸一化為 JPEG/RGB 格式,因此為了使用圖片管道,你需要安裝這個庫。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/38687.html

相關文章

  • 首次公開,整理12年積累的博客收藏夾,零距離展示《收藏夾吃灰》系列博客

    摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...

    Harriet666 評論0 收藏0
  • Python 從零開始爬蟲(三)——實戰:requests+BeautifulSoup實現靜態爬取

    摘要:前篇全片都是生硬的理論使用,今天就放個靜態爬取的實例讓大家體驗一下的使用,了解一些背后的原理。給出網站打開右鍵檢查第一個電影,分析源碼先,發現每個標簽就對應著一個電影的信息。 前篇全片都是生硬的理論使用,今天就放個靜態爬取的實例讓大家體驗一下BeautifulSoup的使用,了解一些背后的原理。 順便在這引入靜態網頁的概念——靜態網頁是指一次性加載所有內容的網頁,爬蟲一次請求便能得到所...

    Codeing_ls 評論0 收藏0
  • 爬蟲 - 收藏集 - 掘金

    摘要:在這之前,還是有必要對一些概念超輕量級反爬蟲方案后端掘金前言爬蟲和反爬蟲日益成為每家公司的標配系統。 爬蟲修煉之道——從網頁中提取結構化數據并保存(以爬取糗百文本板塊所有糗事為例) - 后端 - 掘金歡迎大家關注我的專題:爬蟲修煉之道 上篇 爬蟲修煉之道——編寫一個爬取多頁面的網絡爬蟲主要講解了如何使用python編寫一個可以下載多頁面的爬蟲,如何將相對URL轉為絕對URL,如何限速,...

    1fe1se 評論0 收藏0
  • Python爬蟲之使用Fiddler+Postman+Python的requests模塊爬取各國國旗

    摘要:流程作為上述過程的一個演示,我們使用的網址為頁面如下在表單中輸入德國,跳轉后的頁面如下我們可以發現,在搜索的結果中,會出現德國這個搜索結果。點擊該搜索結果,跳轉后的頁面如下在這個頁面中有我們需要的德國的國旗。 介紹 ??本篇博客將會介紹一個Python爬蟲,用來爬取各個國家的國旗,主要的目標是為了展示如何在Python的requests模塊中使用POST方法來爬取網頁內容。??為了知道...

    laoLiueizo 評論0 收藏0
  • Python爬取"王者農藥"英雄皮膚

    摘要:本篇就來教大家如何使用來爬取這些精美的英雄皮膚。有了英雄編號的對應關系,再找尋下英雄皮膚的鏈接規律。將圖片保存下來,并以英雄名稱皮膚序號方式命名效果展示最終的爬取效果如下圖所示。 showImg(https://segmentfault.com/img/remote/1460000018627654); 0.引言 作為一款現象級游戲,王者榮耀,想必大家都玩過或聽過,游戲里中各式各樣的英...

    馬龍駒 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<