Python_爬虫学习_1

相关内容均学自《精通Python网络爬虫》

Urllib库的简单调用

快速爬取网页

# eg 1:
import urllib.request
file = urllib.request.urlopen('http://www.baidu.com')
data = file.read()
print(data)

会输出百度首页的html代码。

# eg 2:
file = open('C:/Users/Administrator/Desktop/baidu.html','wb')
file.write(data)
file.close()

会在桌面生成一个html文件,打开后发现爬取了图片以外的大部分(所有?)内容。

# eg 3:
file =   urllib.request.urlretrieve('http://www.baidu.com',filename = 'C:/Users/Administrator/Desktop/baidu_another_way.html')

效果同面上的例子。

# 其他语句
urllib.request.urlcleanup() # 清除urlretrieve的缓存
file.info() # 返回与当前环境有关的信息(?)
file.getcode() # 返回状态码200说明响应正确
file.geturl() # 获取当前爬取的url地址
urllib.request.quote('http://...') # 编码不符合URL标准的地址
urllib.request.unquote('http://...') # 解码地址

以上语句待以后需要时进一步学习。

Headers属性

import urllib.request
url = 'http://...'
file = urllib.request.urlopen(url)

如果上述程序运行后出现了403错误,可以让爬虫模拟成浏览器来爬取网页。暂时还没有找到会出现403错误的网页,很尴尬。
模拟方法如下。

# 首先需要用浏览器,获得需要爬取网页的User-Agent字段的内容
# 该字段内容似乎是固定的,获取一次就好,保存起来以后也可以用
# eg 4 使用build_opener()修改报头
import urllib.request
url = 'http://...'
headers = ('User-Agent','User-Agent字段内容')

opener = urllib.request.build_opener() # 创建opener对象
opener.addheaders = [headers]
data = opener.open(url).read() # 网页内容存在了data中

但是,目前仍然用不上。
还有另外一种方法。

# 使用add_header()添加报头
import urllib.request
url = 'http://...'

req = urllib.request.Request(url) # 创建一个Request对象
req.add_header('User-Agent','User-Agent字段内容')
data = urllib.request.urlopen(req).read()

两种方法大同小异。

超时设置

# 在urlopen()中设置timeout参数
import urllib.request
for i in range(1,100):
    try:
        file = urllib.request.urlopen('http://yum.iqianyue.com',timeout = 1)
        data = file.read()
        print(len(data))
    except Exception as e:
        print('出现异常-->'+str(e))

HTTP协议请求

GET请求

import urllib.request
keywd = 'hello'
url = 'http://www.baidu.com/s?wd='+keywd

req = urllib.request.Request(url)
data = urllib.request.urlopen(req).read()
fhandle = open('C:/Users/Administrator/Desktop/search_hello.html','wb')
fhandle.write(data)
fhandle.close()

如果检索中文信息。

import urllib.request
url = 'http://www.baidu.com/s?wd='
key = '海贼王'
key_code = urllib.request.quote(key)
url_all = url+key_code

req = urllib.request.Request(url_all)
data = urllib.request.urlopen(req).read()
fhandle = open('C:/Users/Administrator/Desktop/search_hzw.html','wb')
fhandle.write(data)
fhandle.close()

POST请求

import urllib.request
import urllib.parse
url = 'http://www.iqianyue.com/mypost/'
postdata = urllib.parse.urlencode({'name':'ceo@iqianyue.com','pass':'aA123456'}).encode('utf-8')

req = urllib.request.Request(url,postdata)
req.add_header('User-Agent','Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36 SE 2.X MetaSr 1.0')
data = urllib.request.urlopen(req).read()
fhandle = open('C:/Users/Administrator/Desktop/post_test.html','wb')
fhandle.write(data)
fhandle.close()

代理服务器的设置

用同一个IP去爬取同一个网页,久了之后就会被该网站的服务器屏蔽。
可以用代理服务器解决该问题。
搜索到代理服务器的IP和端口号后,有如下程序。

def use_proxy(proxy_addr,url):
    import urllib.request
    proxy = urllib.request.ProxyHandler({'http':proxy_addr})
    opener = urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
    urllib.request.install_opener(opener)
    data = urllib.request.urlopen(url).read().decode('utf-8')
    return data

proxy_addr = '61.155.164.112:3128'
data = use_proxy(proxy_addr,'http://www.baidu.com')
print(len(data))

尝试了很多代理IP,发现最好采用存活时间长,验证时间短的IP代理,成功率高。

DebugLog

这个功能,菜鸡水平的我暂时还用不上吧。

import urllib.request
httphd = urllib.request.HTTPHandler(debuglevel = 1)
httpshd = urllib.request.HTTPSHandler(debuglevel = 1)
opener = urllib.request.build_opener(httphd,httpshd)
urllib.request.install_opener(opener)
data = urllib.request.urlopen('http://...')

异常处理-URLError

异常处理类:URLError,有子类HTTPError。

import urllib.request
import urllib.error
try:
    urllib.request.urlopen('http://blog.csdn.net')
    print('ojbk')
except urllib.error.URLError as e:
    print(e.code)
    print(e.reason)

实际上,CSDN现在允许爬取博客。不会出现错误。
经常使用以下代码整合URLError以及HTTPError。

import urllib.request
import urllib.error
try:
    urllib.request.urlopen('http://blog.csdn.net')
except urllib.error.URLError as e:
    if hasattr(e,'code'):
        print(e.code)
    if hasattr(e,'reason'):
        print(e.reason)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值