菜鸟学python(三)之网络爬虫入门
通过前面的基本语法学习,我们可以开始实战了,这次实战就是最火的网络爬虫
网络爬虫,也叫网络蜘蛛(Web Spider),如果把互联网比喻成一个蜘蛛网,Spider就是一只在网上爬来爬去的蜘蛛。网络爬虫就是根据网页的地址来寻找网页的,也就是URL。举一个简单的例子,我们在浏览器的地址栏中输入的字符串就是URL,例如:https://www.baidu.com/
在python3中在Python3.x中,我们可以使用urlib这个组件抓取网页,urllib是一个URL处理包,这个包中集合了一些处理URL的模块,如下:
1.urllib.request模块是用来打开和读取URLs的;
2.urllib.error模块包含一些有urllib.request产生的错误,可以使用try进行捕捉处理;
3.urllib.parse模块包含了一些解析URLs的方法;
4.urllib.robotparser模块用来解析robots.txt文本文件.它提供了一个单独的RobotFileParser类,通过该类提供的can_fetch()方法测试爬虫是否可以下载一个页面。
我们使用urllib.request.urlopen()这个接口函数就可以很轻松的打开一个网站,读取并打印信息。
第一个爬虫
from urllib import request
if __name__ == '__main__':
response = request.urlopen("https://www.baidu.com") #用response这个变量接收响应值
html = response.read() #用html这个变量接收response中的read后的值
html = html.decode("utf-8") #进行utf-8转码
print(html)
_name_ 是当前模块名,当模块被直接运行时模块名为 _main_ 。这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。(自行百度知乎)
当然,用chardet
模块的detect()
方法可以自判断出网页的编码格式,因此我们可以编写一个小程序来判断网页的编码格式:
from urllib import request
import chardet
if __name__ == "__main__":
response = request.urlopen("https://www.baidu.com")
html = response.read()
# html = html.decode("utf-8")
charset = chardet.detect(html)
print(charset)
”二代“爬虫(设置User Agent)
有一些网站不喜欢被爬虫程序访问,所以会检测连接对象,如果是爬虫程序,也就是非人点击访问,它就会不让你继续访问,所以为了要让程序可以正常运行,需要隐藏自己的爬虫程序的身份。此时,我们就可以通过设置User Agent的来达到隐藏身份的目的,User Agent的中文名为用户代理,简称UA。
User Agent存放于Headers中,服务器就是通过查看Headers中的User Agent来判断是谁在访问。在Python中,如果不设置User Agent,程序将使用默认的参数,那么这个User Agent就会有Python的字样,如果服务器检查User Agent,那么没有设置User Agent的Python程序将无法正常访问网站。
Python允许我们修改这个User Agent来模拟浏览器访问,它的强大毋庸置疑。要修改User Agent,而User Agent通常是在header中,而header又在Request这个类的属性中,所以我们查看一下Request的属性:
class Request:
def __init__(self, url, data=None, headers={},
origin_req_host=None, unverifiable=False,
method=None):
self.full_url = url
self.headers = {} #这就是我们所需要填写User Agent的地方,它的类型是一个字典类型。
self.unredirected_hdrs = {}
self._data = None
self.data = data
self._tunnel_host = None
因此,想要设置User Agent,有两种方法:
1.在创建Request对象的时候,填入headers参数(包含User Agent信息),这个Headers参数要求为字典;
2.在创建Request对象的时候不添加headers参数,在创建完成之后,使用add_header()的方法,添加headers。
当然,设置“谁”在访问有很多种方法,这里只列举其中几种设备的:
.Google Chrome
Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36
Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile Safari/535.19
iOS
Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3
Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/3A101a Safari/419.3
.Android
Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19
Mozilla/5.0 (Linux; U; Android 4.0.4; en-gb; GT-I9300 Build/IMM76D) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30
Mozilla/5.0 (Linux; U; Android 2.2; en-gb; GT-P1000 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
实战一波:(抓csdn的主页)
from urllib import request
if __name__ == "__main__":
url = "https://www.csdn.net/"
head = {}
head['User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gec' \
'ko) Chrome/18.0.1025.166 Safari/535.19'
req = request.Request(url,headers=head)
response = request.urlopen(req)
html = response.read().decode('utf-8')
print(html)
使用第二种方法抓取:
from urllib import request
if __name__ == "__main__":
#以CSDN为例,CSDN不更改User Agent是无法访问的
url = 'http://www.csdn.net/'
#创建Request对象
req = request.Request(url)
#传入headers
req.add_header('User-Agent', 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19')
#传入创建好的Request对象
response = request.urlopen(req)