1

两种典型爬虫:通用网络爬虫、聚焦网络爬虫

通用网络爬虫实现原理与过程:

  • 获取初始的URL
  • 根据初始的URL爬取页面并获取新的URL
  • 将新的URL放到URL队列中
  • 从URL队列中读取新的URL,并根据新的URL爬取网页,同时从新网页中获取新的URL,并重复上述爬取过程
  • 满足爬虫系统设置的停止条件时,停止爬取

聚焦网络爬虫(有目的地进行爬取)实现原理与过程:

  • 定义和描述要爬取的目标

  • 获取初始的URL

  • 根据初始的URL爬取页面并获取新的URL

  • 从新的URL中过滤掉与爬取目标无关的链接,同时将已爬取的URL地址存放到一个URL列表中,用于去重和判断爬取的进程
    将过滤后的链接放到URL队列中

  • 从URL队列中,根据搜索算法,确定URL的优先级,并确定下一步要爬取的URL地址

  • 从下一步要爬取的URL地址中,读取新的URL,然后依据新的URL地址爬取网页,并重复上述爬取过程

  • 满足系统中设置的停止条件,或无法获取新的URL地址时,停止爬行
    爬行策略

    主要有深度优先、广度优先、最佳优先等爬行策略。

身份识别

一般的,爬虫对网页进行爬取的时候,会通过HTTP请求中的User Agent字段告知自己的身份信息。一般爬虫访问一个网站的时候,首先会根据该站点下的Robots.txt文件来确定可以爬取的网页范围,Robots协议是需要网络爬虫共同遵守的协议,对于一些禁止的URL地址,网络爬虫则不应该爬取访问。

爬虫方法

本篇笔记主要记录利用python爬取数据时最常用的两个方法库:Requests库和Scrapy库

Requests

#常用的模版:

import requests
url = ''
def geturl(url):
    try:
        r = requests.get(url,timeout = 10)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        print(r.text[:1000])//return r.text[:1000]
    except:
        print('error')

Requests主要方法

image
# 常用命令:
requests.get()      
requests.head()     #当网页比较大的时候,先获取它的头部信息

# 一般用法:
requests.get/head('网址',**kwargs)
kv = 字典
params = kv         #用于网址?后面添加内容
headers = kv        #用于改变爬虫的user-agent
timeout = 10        

image

Requests属性

image
r.content       #用于当要以二进制形式存储的时候

Re库的基本使用

import re #主要用于字符串匹配

re库主要使用raw string类型(原生字符串类型)
如:r'[1-9],{5}'
原生字符串即不包含转义符的字符串.
Re库主要功能函数

函数 说明
re.seach() 在一个字符串中搜索匹配正则表达式的第一个位置,返回match对象.
re.match() 从一个字符串的开始位置起匹配正则表达式,返回match对象.
re.findall() 搜索字符串,以列表类型返回全部能匹配的字符串.
re.split() 将一个字符串按照正则表达式结果进行分割,返回列表类型.
re.finditer() 搜索字符串,返回一个匹配结果的迭代类型,每一个迭代元素是match对象.
re.sub() 在一个字符串中替换所有匹配正则表达式的子串,返回替换后的字符串.

re.search(pattern,string,flags=0)

  • pattern:正则表达式的字符串或原生字符串表示
  • string:待匹配字符串
  • flags:正则表达式使用的控制标记
常用标记 说明
re.I re.IGNORECASE 忽略正则表达式的大小写,[A-Z]能够匹配小写字符
re.M re.MULTILINE 正则表达式中的^操作符能够将给定字符串的每行当作匹配开始
re.S re.DOTALL 正则表达式中的.操作符能够匹配所有字符,默认匹配所有除换行符外的所有字符

import re
match=re.search(r'[1-9]\d{5}','BIT100081')
if match:
    print(match.group(0))
#输出 100081

type(match)#输出 _sre.SRE_Match

match就是一次匹配的结果.

match对象的属性 说明
.string 待匹配的文本
.re 匹配时使用的pattern对象(正则表达式)
.pos 正则表达式搜索文本的开始位置
.endpos 正则表达式搜索文本的将结束为止
match对象的方法 说明
.group(0) 获得匹配后的字符串
.start() 匹配字符串在原始字符串的开始位置
.end() 匹配字符串在原始字符串的结束为止
.span() 返回(.start(),.end())

Re库默认采用贪婪匹配,即输出匹配最长的子串.

match=re.search(r'PY.*N','PYANBNCNDN')
match.group(0)
#贪婪匹配,输出PYANBNCNDN

match=re.search(r'PY.*?N','PYANBNCNDN')#加?号后,为最小匹配,输出PYAN
match.group(0)
最小匹配操作符 使用说明
*? 前一个字符0次或无限次扩展,最小匹配
+? 前一个字符1次或无限次扩展,最小匹配
?? 前一个字符0次或1次扩展,最小匹配
{m,n}? 扩展前一个字符m至n次(含n),最小匹配

事实上,操作符后加"?",就可以获得匹配结果.

Scrapy

常用命令

image
  1. scrapy startproject name
    cd name 
    scrapy genspider sname           #创建工程,spider模版
    
  2. 编写spider里的.py内容              #进行内容爬取和信息处理
    
    #def parse就是对get到的Response进行处理
    
    
  3. 编写pipelines.py文件          #对所得到的信息做进一步处理
    
  4. 修改setting.py                #对爬虫的性能做进一步优化
    
  5. scrapy crawl name                #运行爬虫
    


爬虫中的注意点

  • 对于url网址,不必在意里面一些复杂的内容,可以直接忽略,找几个网址的共同点

  • 获取到html信息后,可以用beautifulsoup进行形式解析处理;也可以直接进行搜索+re

  • eval()#可以去引号
    
  • url里必须都是字符串形式

  • 正则表达式中“两者选其一并且可无限扩充”用

    [abc]*
    
  • 不要拘泥于一个信息源(一个网站),选择最合适爬虫的网站

  • 只要是在爬取时、循环时一定要异常处理

  • 如果返回值是列表,而且只有一个元素或者有了特定要选取的元素。可以直接在后面添加[0]

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

推荐阅读更多精彩内容