在这个信息爆炸的时代,数据筛选和大数据分析是很重要的过程,而这一过程需要数据源,爬虫则可以获取大量数据源。本文则主要对爬取网页的过程做一个详细的介绍,有助于对爬虫知识的入门。
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,轮询访问该博客,即可提升访问成功率。