爬虫原理及爬虫常用的几种技巧

爬虫的原理是,从一个其实种子链接开始,发送http请求这个链接,得到该链接中的内容,然后大多正则匹配里面的有效链接,然后将这些链接保存到带访问队列中,等待爬取线程取这个待访问队列,一旦链接已访问,为了有效减少不必要的网络请求,我们把已访问的链接放到已访问的Map中,防止重复抓取和死循环。
以上提到的过程是一个简单的爬虫实现,还有更复杂的爬虫实现,如需要使用代理服务器‘伪装成浏览器、登录和提取验证码等。
这里面有几个概念,一个是发送http请求,一个是正则匹配你感兴趣的链接。
爬虫的原理相对简单,爬取网页的基本步骤如下:

  1. 人工给定一个URL作为入口,从这里开始爬取。
    万维网的可视图呈蝴蝶型,网络爬虫一般从蝴蝶型左边结构出发,这里有一些门户网站的主页,而门户网站中包含大量有价值的链接
  2. 用运行队列和已完成队列保存不同状态的链接
    对于大型数据而言,内存中的队列是不够用的,通常采用数据库模拟队列,用这种方法既可以进行海量数据抓取,又可以拥有断点续抓功能。
  3. 线程从运行队列读取队首URL,如果存在就继续执行,反之停止爬取。
  4. 每处理完一个URL,将其放入完成队列,防止重复访问
  5. 每次抓去网页后分析其中的URL,将经过过滤的合法连接写入运行队列,等待提取
  6. 重复步骤3.步骤 4.步骤 5.

基本方法

Python中最基本的网络怕取几行代码就可以实现,只需要使用urllib模块中的request即可:

#! /usr/bin/python3
#-*- coding:utf-8 -*-

from urllib import request

res=resquest.urlopen("https://movies.douban.com")
content=res.read().decode('utf-8')
print(content)

结果可以输出许多带HTML样式 的文本,大部分是无用的信息。
这种方法虽然非常简单,但抓取到的信息未经过任何加工处理,所以没有多大的用处

使用代理服务器

为什么要使用代理服务器?
当前很多网站都有反爬虫机制,一旦发现某个IP在一定时间内请求次数过多或请求频率太高,就可能将这个IP标记为恶意IP,从而限制这个IP的访问,或者将这个IP加入黑名单,使之不能继续访问该网站。
这时我们就需要使用代理服务器,通过使用不同的代理服务器继续抓取需要的信息。:

#! /usr/bin/python3
#-*- coding:utf-8 -*-
from urllib import request

pro_support=request.ProxyHandler({'http':'http://xx.xx.xx.xx:xx'})
opener=request.build_opener(pro_support,request.HTTPHandler)
request.install_opener(opener)

res=request.urlopen("https://movie.douban.com/top250").read().decode('utf-8')
print(res)

和基本方法一样,这样爬取的信息没有经过加工处理,也没有多大用处,需要进一步加工处理才能体现价值。

cookie处理
对于安全级别稍微高一点的网站,使用前两种方法都无法爬取数据。

这些网站需要在发送URL请求时提供cookie信息,否则无法请求成功:

#! /usr/bin/python3
#-*- coding:utf-8 -*-

from urllib import request
from http import cookiejar


cookie_=request.HTTPCookieProcessor(cookiejar.CookieJar())
opener=request.build_opener(cookie_,request.HTTPHandler)
request.install_opener(opener)

res=request.urlopen("https://movie.douban.com/top250").read().decode('utf-8')
print(res)

当然,这也是一种简单的方式,还可以拓展为更复杂的模式。

伪装成浏览器
当前很多网站都有反爬虫机制,对于爬虫请求一律拒绝

程序怎样区分一个请求是正常还是爬虫程序发送的请求呢?
程序通过判断发送请求中是否有浏览器信息判断一个请求是否为正常请求。
当访问有反爬虫机制的网站时,我们在请求中设置浏览器信息(伪装成浏览器),通过修改HTTP包中的header实现。

postdata=parse.urlencode({})
headers={
    'User-Agent':'Mozilla/5.0(Windows Nt 6.1;en-US;rv:1.9.1.6)Gecko/20091201Firefox/3.5.6'
}
req=request.Request(url='https://www.zhihu.com/', data=postdata, headers=headers)

通过在headers中设置浏览器信息,并将headers放入request请求中,就可以伪装成浏览器。

登录
对于当前大多数网站来说,登录是必不可少的。

我们平常登录都时在浏览器上进行的。其实时通过浏览器向对应服务器发送登录请求,服务器验证通过后在向浏览器发送登录成功信息,并将页面转向登陆成功页面,展现相关内容。
使用爬虫程序登录时,其实就是模仿浏览器发送登录请求,将登录需要的用户名和密码放到请求数据中。

postdata=parse.urlencode({
    'username':'XXXXXXXX',
    'password':'XXXXXXXX',
    'continueURL':'http://www.verycd.com/',
    'fk':'fkasdfasdf'
    'login_submit':'登录'
})

构建好请求数据后,再将构建的数据放入请求中;

req=request.Request(
    url='https://www.zhihu.com/',
    data=postdata
)
content=request.urlopen(req).read()

print(content)

通过这种方式可以模拟浏览器登录相关网站。
当然,还有不少网站需要验证码,这时需要编写获取验证码的程序。


❤️


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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,451评论 25 707
  • 太阳睡着后—— 叶子载着露水 露水载着月亮 月亮家住着一双眼睛 眼睛依着窗 窗外有棵树 叶子沙沙响 太阳醒来后——...
    安正树阅读 133评论 0 4
  • “意识“这个词来源于拉丁文,本意是“共同的认识与了解”。那么,意识的对立面是什么呢?我认为它就是潜意识,潜意...
    造个院子过生活阅读 832评论 0 0
  • 这个城市永远只会给我一种熟悉的陌生窒息感。 开车经过的每一条街道,过去的每一幅画面,流逝的每一寸光景,无一不全身心...
    欲語須至阅读 298评论 0 0