Python网络爬虫三

浏览: 1592

作者:我为峰2014

链接:https://www.jianshu.com/p/839fb07a7aac

來源:简书

前言

前面说的都是爬取评论,这次打算爬取一下图片

例子

图片爬虫

思路

1.发起请求
2.得到响应的二进制数据
3.以二进制数据创建图片
4.保存

示例

这是我在桌面壁纸网找到的一个卡通美女图的资源地址

http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/08/0B/ChMkJlbZOHGIQPkpAA-T3dOxKtsAAMhjwHmJocAD5P1844.jpg

第一步,发起请求

代码

import requests
url = 'http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/08/0B/ChMkJlbZOHGIQPkpAA-T3dOxKtsAAMhjwHmJocAD5P1844.jpg'
resp = requests.get(url)
print(resp)

结果
<Response [200]>

第二步,获取二进制数据

代码

resp.content

结果

第三步,以二进制数据创建图片

代码

from PIL import Image
from io import BytesIO

pic = Image.open(BytesIO(resp.content))
pic.save('H:/py/Pro_py3/2.jpg','jpeg')

图片爬虫icrawler

https://github.com/hellock/icrawler

icrawler基本用法

内置爬虫

该框架包含6个内置的图像抓取工具。

  • 谷歌
  • bing
  • 百度
  • Flickr
  • 通用网站图片爬虫(greedy)
  • UrlList(抓取给定URL列表的图像)
from icrawler.builtin import BaiduImageCrawler 
from icrawler.builtin import BingImageCrawler
from icrawler.builtin import GoogleImageCrawler
"""
parser_threads:解析器线程数目,最大为cpu数目
downloader_threads:下载线程数目,最大为cpu数目
storage:存储地址,使用字典格式。key为root_dir
keyword:浏览器搜索框输入的关键词
max_num:最大下载图片数目
"""


#谷歌图片爬虫
google_storage = {'root_dir': '/Users/suosuo/Desktop/icrawler学习/google'}
google_crawler = GoogleImageCrawler(parser_threads=4,
downloader_threads=4,
storage=google_storage)
google_crawler.crawl(keyword='beauty',
max_num=10)


#必应图片爬虫
bing_storage = {'root_dir': '/Users/suosuo/Desktop/icrawler学习/bing'}
bing_crawler = BingImageCrawler(parser_threads=2,
downloader_threads=4,
storage=bing_storage)
bing_crawler.crawl(keyword='beauty',
max_num=10)


#百度图片爬虫
baidu_storage = {'root_dir': '/Users/suosuo/Desktop/icrawler学习/baidu'}

baidu_crawler = BaiduImageCrawler(parser_threads=2,
downloader_threads=4,
storage=baidu_storage)
baidu_crawler.crawl(keyword='美女',
max_num=10)

GreedyImageCrawler

如果你想爬某一个网站,不属于以上的网站的图片,可以使用贪婪图片爬虫类,输入目标网址。

from icrawler.builtin import GreedyImageCrawler

storage= {'root_dir': '/Users/suosuo/Desktop/icrawler学习/greedy'}
greedy_crawler = GreedyImageCrawler(storage=storage)
greedy_crawler.crawl(domains='http://desk.zol.com.cn/bizhi/6849_85484_2.html',
max_num=6)

UrlListCrawler

如果你已经拥有了图片的下载地址,可以直接使用UrlListCrawler,为了高效抓取,可以使用多线程方式下载,快速抓取目标数据。

from icrawler.builtin import UrlListCrawler

storage={'root_dir': '/Users/suosuo/Desktop/icrawler学习/urllist'}
urllist_crawler = UrlListCrawler(downloader_threads=4,
storage=storage)

#输入url的txt文件。
urllist_crawler.crawl('url_list.txt')

定义自己的图片爬虫

通过icrawler我们很容易扩展,最简单的方式是重写Feeder,Parser和downloader这三个类。

  • Feeders:给crawler爬虫喂url,待爬
  • Parser:解析器(对某个url请求后得到该url的html文件,我们通过parser可以解析出html中的图片下载地址)
  • Downloader:图片下载器

Feeder

重写Feeder,需要改的方法:
feeder.feed(self, **kwargs)

如果你想一次提供一个起始url,例如从http://example.com/pageurl/1爬到http://example.com/page*url/10

我们可以这样重写Feeder

from icrawler import Feeder

class MyFeeder(Feeder):
def feed(self):
for i in range(10):
url = 'http://example.com/page_url/{}'.format(i + 1)

# 感觉这里的output类似于yield一个url给downloader
self.output(url)

Parser

重写Parser,需要改的方法:
parser.parse(self, response, **kwargs)
对某个url请求后得到该url的html文件,我们通过parser可以解析出html中的图片下载地址。解析方法文档中建议使用BeautifulSoup,这里以GoogleParser为例

class GoogleParser(Parser):

def parse(self, response):
soup = BeautifulSoup(response.content, 'lxml')
image_divs = soup.find_all('div', class_='rg_di rg_el ivg-i')
for div in image_divs:
meta = json.loads(div.text)
if 'ou' in meta:

#将解析到的url以字典形式yield处理,注意字典的键使用的file_url
yield dict(file_url=meta['ou'])

Downloader

如果你想改变图片的保存时的文件名,可以这样重写方法

downloader.get_filename(self, task, default_ext)
默认的文件名命名规则是从000001 到 999999。这里是另外一种命名规则的实现

import base64from icrawler import ImageDownloader
from icrawler.builtin import GoogleImageCrawler
from six.moves.urllib.parse import urlparse

class PrefixNameDownloader(ImageDownloader):

def get_filename(self, task, default_ext):
filename = super(PrefixNameDownloader, self).get_filename(
task, default_ext)
return 'prefix_' + filename


class Base64NameDownloader(ImageDownloader):

def get_filename(self, task, default_ext):
url_path = urlparse(task['file_url'])[2]
if '.' in url_path:
extension = url_path.split('.')[-1]
if extension.lower() not in ['jpg', 'jpeg', 'png', 'bmp', 'tiff', 'gif', 'ppm', 'pgm']:
extension = default_ext
else:
extension = default_ext
# works for python 3
filename = base64.b64encode(url_path.encode()).decode()
return '{}.{}'.format(filename, extension)



google_crawler = GoogleImageCrawler(downloader_cls=PrefixNameDownloader,
# downloader_cls=Base64NameDownloader,
downloader_threads=4,
storage={'root_dir': 'images/google'})

google_crawler.crawl('tesla', max_num=10)

Crawler

到现在,我们可以使用自己重写的Feeder、Parser、Downloader

storage={'backend': 'FileSystem', 'root_dir': 'images'}
crawler = Crawler(feeder_cls=MyFeeder,
parser_cls=MyParser,
downloader_cls=ImageDownloader,
downloader_threads=4,
storage=storage)

crawler.crawl(feeder_kwargs=dict(arg1='blabla', arg2=0),max_num=1000)
推荐 0
本文由 Python爱好者社区 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册