Python爬虫--Icrawler(一)

一、爬虫简介

  在爬取一些简单的(没有反爬机制的)静态网页时,一般采取的策略是:选中目标(所谓的url链接),观察结构(链接结构,网页结构),构思动手(选用什么HTML下载器,解析器等)。

在爬虫过程中,都会涉及到三种利器:
HTML下载器:下载HTML网页;
HTML解析器:解析出有效数据;
数据存储器:将有效数据通过文件或者数据库的形式存储起来。

1、将数据以字典形式建立
  首先要知道,data里面的内容是都需要在代码中发送给服务器的。
2、反爬虫机制
  理解反爬虫机制,找出加密参数。大多数网站的反爬虫的机制是对向服务器提交表单的动态值进行加密,所以,我们每翻译一次,就观察data里面有哪些参数是动态变化的。从这个网址来看,参数salt、sign对应的值是动态变化。找出动态参数的实现方式。根据反爬虫经验可知,一般网站生成的反爬加密值都是采用的时间戳,以及将一下字符串使用加密算法加密一下,我们可以从网页源代码中进行查找理解。
(1)、伪装浏览器:在 HTTP Request 中加入特定的 Header 要加入 header,需要使用 Request 对象。对有些 header 要特别留意,服务器会针对这些 header 做检查。

User-Agent : 有些服务器或 Proxy 会通过该值来判断是否是浏览器发出的请求
Content-Type : 在使用 REST 接口时,服务器会检查该值,用来确定 HTTP Body 中的内容该怎样解析。常见的取值有:
application/xml : 在 XML RPC,如 RESTful/SOAP 调用时使用
application/json : 在 JSON RPC 调用时使用
application/x-www-form-urlencoded : 浏览器提交 Web 表单时使用

  在使用服务器提供的 RESTful 或 SOAP 服务时, Content-Type 设置错误会导致服务器拒绝服务。
(2)、调用代理访问
原因:一个合格的网站为了防止服务器负载过大,也应该设置这样的机制来限制频繁请求。很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会会禁止这个IP的访问。所以我们需要设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取。
策略
  采用时间间隔(单个IP):为了防止一个IP访问过于频繁而造成的的拒绝访问,治标的方法是,在求请访问的时候设置一定的时间间隔。import time ...... time.sleep(10) ......
  采用动态代理(多个IP):可以事先获取cn-proxy代理的IP地址,写到一个列表内,采用随机的方法获取不同的代理ip地址。
requests、beautifulsoup是爬虫两大神器,reuqests 用于网络请求,beautifusoup 用于操作 html 数据。
icrawler网址:
https://github.com/hellock/icrawler

二、Crawler安装

(base) C:\Users\Administrator>pip3 install icrawler


Crawler安装

三、Crawler基本用法

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

  1. 谷歌
  2. bing
  3. 百度
  4. Flickr
  5. 通用网站图片爬虫(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/7176_88816_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/page url/1爬到http://example.com/page url/10 我们可以这样重写Feeder

from icrawler import Feederclass 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)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 前言 前面说的都是爬取评论,这次打算爬取一下图片 例子 图片爬虫 思路 1.发起请求2.得到响应的二进制数据3.以...
    我为峰2014阅读 2,312评论 0 1
  • [TOC] 1.基本概念 爬虫就是获取网页并提取和保存信息的自动化程序 1.HTTP基本原理理 1.URI和URL...
    文化银儿阅读 1,613评论 0 0
  • 整理了Node.js、PHP、Go、JAVA、Ruby、Python等语言的爬虫框架。不知道读者们都用过什么爬虫框...
    SeanCheney阅读 5,687评论 0 16
  • 背景 部门(东方IC、图虫)业务驱动,需要搜集大量图片资源,做数据分析,以及正版图片维权。前期主要用node做爬虫...
    字节跳动技术团队阅读 7,523评论 1 67
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,401评论 16 21