Python 爬虫知识记——基础篇

简单的爬虫请求:
# 注意在python3.3以上,用urllib.request替换了之前的urllib2
import urllib.request

request = urllib.request.Request("https://github.com/JackLiaoJH/ImageSelect")
# urllib.request.urlopen(url,data,timeout) :第一个参数url,第二个参数是访问url要传送的数据,第三个参数是设置超时的时间
response = urllib.request.urlopen(request)
print(response.read())

这样就会获取到指定网页的数据了。

GET 请求模拟

import urllib.request
import urllib.parse
import urllib

# get请求
values = {"username": "100000000@qq.com", "password": "23456"}
dataGet = urllib.parse.urlencode(values)
urlGet = "https://www.oschina.net/home/login" + "?" + dataGet
requestGet = urllib.request.Request(urlGet)
responseGet = urllib.request.urlopen(requestGet)
print(responseGet.read().decode('UTF-8'))

post 请求模拟

import urllib.request
import urllib.parse
import urllib

# post请求,比如登录开源中国
params = {"username": "100000000@qq.com", "password": "23456"}
data = urllib.parse.urlencode(params)
url = "https://www.oschina.net/home/login?goto_page=https%3A%2F%2Fwww.oschina.net%2F";
request1 = urllib.request.Request(url)
response1 = urllib.request.urlopen(request1)
print(response1.read())

headers 请求头设置

下面先看访问开源中国登录界面,这个界面包含了很多信息,可以按f12查看请求细节,下面是请求截图:


请求网址头部.png

在urllib.request.Request(urlGet, data, headers)这个方法里面设置data,header。

例子:

# get请求设置请求头
values = {"username": "100000000@qq.com", "password": "23456"}
dataGet = urllib.parse.urlencode(values)
urlGet = "https://www.oschina.net/home/login" + "?" + dataGet
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) Chrome/56.0.2924.10 Safari/537.36",
           "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"}
requestGet = urllib.request.Request(urlGet, None, headers)
responseGet = urllib.request.urlopen(requestGet)
print(responseGet.read().decode('UTF-8'))

另外为了对付防盗链,对方服务器会事变header中的Referer是不是自己的,所以我们会在头部中加上Referer,如:

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) Chrome/56.0.2924.10 Safari/537.36",
       "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
       "Referer": "https://www.oschina.net/"}

在进行爬虫时我们还需要注意其他相关参数,设置错误,服务器会拒绝我们访问,所以要仔细看好请求头所需要的必须字段。

urllib 的高级用法

Proxy (代理)的设置

urllib.request默认会使用环境变量http_proxy来设置Http 代理,所以我们可以通过这个来设置一些代理服务器,每隔一段时间换一个代理去爬取数据,这个就可以防止你的ip由于过多访问被禁止访问的风险,设置方法如下:

import urllib.request

enable_proxy = True
# 设置代理服务器
proxy_handler = urllib.request.ProxyHandler({"http": 'http://proxy_xxx.com:8090'})
null_proxy_handler = urllib.request.ProxyHandler({})
if enable_proxy:
    opener = urllib.request.build_opener(proxy_handler)
else:
    opener = urllib.request.build_opener(null_proxy_handler)
urllib.request.install_opener(opener)
TimeOut 设置

为了解决我们在爬取时由于服务器响应过慢而造成的影响,我们可以设置我们自己的超时时间,防止一直占用资源,设置也非常简单,代码如下:

# 如果第二个参数data为空,则需要指定timeout=多少,若data已传入,则不需要指明
response = urllib.request.urlopen('http://www.baidu.com',data, 10)
response = urllib.request.urlopen('http://www.baidu.com',timeout=10)
UrlError

在爬取时,由于种种原因会导致失败,这个时候我们可以通过try-exception来捕获相关的异常,代码如下:

import urllib.error

request = urllib.request.Request("http://www.i love you.com")
try:
    urllib.request.urlopen(request)
except urllib.error.URLError as e:
    print(e.reason)

报错:[WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

下面重点介绍下HTTPError,HTTPError是UrlError的子类,服务端返回的常见状态吗如下:

100:继续  客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。
101: 转换协议  在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。
102:继续处理   由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。
200:请求成功      处理方式:获得响应的内容,进行处理
201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到    处理方式:爬虫中不会遇到
202:请求被接受,但处理尚未完成    处理方式:阻塞等待
204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。    处理方式:丢弃
300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。    处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃
301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源    处理方式:重定向到分配的URL
302:请求到的资源在一个不同的URL处临时保存     处理方式:重定向到临时的URL
304:请求的资源未更新     处理方式:丢弃
400:非法请求     处理方式:丢弃
401:未授权     处理方式:丢弃
403:禁止     处理方式:丢弃
404:没有找到     处理方式:丢弃
500:服务器内部错误  服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。
501:服务器无法识别  服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
502:错误网关  作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503:服务出错   由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。

由于urllib.request可以处理重定向,所以3开头的我们看不到,我们只能看到400以上的错误码,下面取个例子体验下:

import urllib.request
import urllib.error

requestError = urllib.request.Request("http://write.blog.csdn.net/postlist")
try:
    response = urllib.request.urlopen(requestError)
    print(response.read().decode('UTF-8'))
except urllib.error.HTTPError as e:
    print(e.code + "," + e.reason)

还可以这么写,支持多级异常捕获,但是只要前面一级已经捕获到了,就不再往后走了:

import urllib.request
import urllib.error

requestError = urllib.request.Request("http://blog.csdn.net/jackliao1/article/details/52473925")
try:
    response = urllib.request.urlopen(requestError)

except urllib.error.HTTPError as e:
    if hasattr(e, "code"):  # 判断是否有该属性
        print(e.code + "," + e.reason)
except urllib.error.URLError as e:
    print(e.reason)
else:
    print(response.read().decode('UTF-8'))

第一篇就先写到这了,下一篇进行python cookie的处理。

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

推荐阅读更多精彩内容