爬虫入门实践之使用Urllib爬取网页

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/carson0408/article/details/89816342

        在这个信息爆炸的时代,数据筛选和大数据分析是很重要的过程,而这一过程需要数据源,爬虫则可以获取大量数据源。本文则主要对爬取网页的过程做一个详细的介绍,有助于对爬虫知识的入门。

1.使用Urllib爬取网页

        Urllib库是Python中用于操作URL、爬虫且具有强大功能的库。该库在Python2.x和Python3.x有一定的区别,本文使用的是Python2.x,所以对应的库是将Python2.x两个库Urllib和Urllib2合并成Urllib库。首先介绍最简单的网页爬虫实例,了解一下网页爬虫的简单流程。本节以爬虫http://www.baidu.com网址为例。分为以下步骤:

1.导入模块:import urllib.request

2.打开并爬取网页:file=urllib.request.urlopen("http://www.baidu.com")

3.读取网页数据:data=file.read()

4.以写入的形式打开本地一个文件:fhandle = open("C:/Users/carson0408/Desktop/webcrawler/1.html","wb")

5.将data写入该文件中:fhandle.write(data)

6.关闭文件:fhandle.close()

注:如有需要可以将爬取网页读取的数据data输出:print(data)

完整代码如下:

import urllib.request
file = urllib.request.urlopen("http://www.baidu.com")
data = file.read()
fhandle = open("C:/Users/carson0408/Desktop/webcrawler/1.html","wb")#定义一个文件
fhandle.write(data)#将爬取到的网页数据写进该文件中
fhandle.close()
print(data)

查看文件1.html

         以上是利用Urllib爬取网页信息的基本步骤,可以通过这种手段获取指定URL对应的数据。

2.Get请求实例

        上一节讲述了通过Urllib来进行爬取百度首页,那么如果要获取百度某个关键字段信息呢?可以通过Get请求相关规则构造相应URL,然后利用上一节的步骤即可实现爬虫。

        Http中的Get方法会将搜索的关键字信息直接添加进网址中,将搜索的关键词赋予网址的关键性字段wd,这里以搜索Alibaba为例。

代码如下:

import urllib.request
keywd = "Alibaba"
url="http://www.baidu.com/s?wd="+keywd
req = urllib.request.Request(url)
file = urllib.request.urlopen(req)
data = file.read()
fhandle = open("C:/Users/carson0408/Desktop/webcrawler/2.html","wb")#定义一个文件
fhandle.write(data)#将爬取到的网页数据写进该文件中
fhandle.close()
print(data)

以上代码涉及的步骤如下:

1.根据搜索的关键字构造对应的URL地址,URL地址满足Get请求的格式,即"http://网址?字段名1=字段内容1&字段名2=字段内容2",这里字段wd=Alibaba,可以结合搜索信息构造URL。

2.通过构造好的URL,创建Request对象:req=urllib.request.Request(url)

3.通过urlopen()打开构建的Request对象

4.读取Request对象的数据

5.打开本地文件,并将数据写入文件。

运行代码,结果如下所示,

如上图所示,可以通过该方法对关键字 进行爬取相关信息,但是如果关键字是中文字的话,则需要特殊处理,直接搜索会出现编码错误。因此,在对中文关键字进行爬取时,需要对关键字进行编码然后再构造URL。

代码如下:

import urllib.request
key="腾讯"
key_code = urllib.request.quote(key)#利用这个方法进行编码
url="http://www.baidu.com/s?wd="+key_code#构造URL
req=urllib.request.Request(url)#构造Request对象
data = urllib.request.urlopen(req).read()#获取爬取的数据
fhandle = open("C:/Users/carson0408/Desktop/webcrawler/3.html","wb")
fhandle.write(data)
fhandle.close()
print(data)

步骤如下:

1.对关键字编码:使用urllib.request.quote(key)方法对关键词key进行编码

2.构造URL

3.构造Request对象

4.获取数据

5.打开本地文件并写入数据

运行代码,结果如下:

3.代理服务器的设置

        如果使用当前ip重复爬取同一个网址对应的网页,那么该ip很可能会被网站服务器屏蔽,比如刷某新闻或者公众号的访问量时,同一个ip重复访问,容易被屏蔽。对于这种情况可以使用代理ip来解决,即隐藏真实的ip。 以下通过访问一篇新浪NBA来实践,地址:http://sports.sina.com.cn/nba/

首先获取代理ip,可以访问https://www.xicidaili.com/获取合适的代理ip,这里选择addr="171.41.82.147:9999",然后设置代理进行访问,代码如下:

def ip_proxy(proxy_addr,url):
    import urllib.request
    proxy = urllib.request.ProxyHandler({'https':proxy_addr})
    opener = urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
    urllib.request.install_opener(opener)
    data = urllib.request.urlopen(url).read()
    return data
proxy_addr = "171.41.82.147:9999"
url = "http://sports.sina.com.cn/nba/"
data = ip_proxy(proxy_addr,"http://www.baidu.com")
fhandle = open("C:/Users/carson0408/Desktop/webcrawler/4.html","wb")#定义一个文件
fhandle.write(data)#将爬取到的网页数据写进该文件中
fhandle.close()
print(data)

ip_proxy(proxy_addr,url)函数中,proxy_addr即为代理ip,url则为待访问URL,函数中步骤如下:

1.设置对应的代理服务器信息:urllib.requesrt.ProxyHandler({'https':proxy_addr})

2.创建一个opener对象:urllib.request.build_opener(proxy,urllib.request.HTTPHandler),两个参数,一个设置的代理信息,一个是HTTPHandler类。

3.将上述opener对象创建成全局默认的opener对象:urllib.request.install_opener(opener)

代理完成后便可根据一般爬虫步骤接着进行获取信息。

运行代码,并打开本地的网页,如下所示:

延伸:

        如果重复执行以上代码之后,就会出现如下报错,那是因为该代理ip被该博客的网站服务器屏蔽了。

可以通过使用多个代理ip,轮询访问该博客,即可提升访问成功率。 

猜你喜欢

转载自blog.csdn.net/carson0408/article/details/89816342