目录
urllib库的概述
urllib库是python内置的HTTP请求库,它可以看作处理URL的组件集合。
urllib库包含四大模块:
- urllib.request:请求模块
- urllib.error:异常处理模块。
- urllib.parse:URL解析模块。
- urllib.robotparser:robots.txt解析模块。
使用urllib爬取网页
爬取网页其实是就是通过URL获取网页信息,这段网页信息的实质就是一段附加了JavaSpcript和CSS的HTML代码。如果把网页比作一个人,那么HTML就是他的骨架,JawaScript是他的肌肉,CSS是他的衣服。由此看来,网页最重要的数据部分是存在于HTML中的。
爬取一个网页
import urllib.request
#调用urllib.request库的urlopen()方法,并传入一个url
response=urllib.request.urlopen('http://www.baidu.com')
#使用read()方法读取获取到的网页内容
html=response.read().decode('UTF-8')
#打印网页内容
print(html)
爬取网页结果
这个结果跟在浏览器打开百度首页,右击选择“查看页面源代码”的结果一模一样。意思就是说这几行代码把百度的全部代码下载下来了。
urllib库的安装
urllib2是Python中用来打开URL的一个模块,它和urllib模块类似,都可以用来打开URL并从中获取数据。两者的主要区别在于,urllib2可以接受一个Request类的实例来设置URL请求的headers,这可以帮助我们的代码伪装成浏览器,而urllib只可以接受URL。此外,urllib提供urlencode方法来encode发送的数据,而urllib2没有。因此,urllib和urllib2会一起使用,以取长补短。在Python 3中,urllib2已被合并为urllib库的一部分。
第一步先确认python版本
如果你使用的是python2.x版本,那么urllib2库已经内置的了,你就不用安装,但如果你使用的是python3.x版本,你需要安装urllib2的替代库urllib,request和urllib.error
第二步
1.打开终端或者命令提示符
2运行以下命令来安装urllib2的替代库
pip install urllib3
分析urlopen()方法
response=urllib.request.urlopen('http://www.baidu.com')
该句代码调用的就是urllib.request模块中的urlopen()方法,它传入了一个百度首页的url,使用的协议是http,这个是urlopen()方法最简单的用法。
urlopen方法可以接收多个参数,定义格式如下:
urllib.request.urlopen(url,data=None[timeout,]*,cafile=None,capath=None,cadefault=False,context=None)
参数的介绍:
- url:表示目标资源在网站中的位置。
- data:用来指明向服务器发送请求的额外信息
- timeout:该参数用于设置超时时间,单位是秒
- context:实现SSL加密传输,该参数很少使用
使用HTTPResponse对象
在使用urllib.request模块中的urlopen()方法发送http请求后,服务器返回的响应内容封装在一个HTTPResponse类型的对象中。
HTTPResponse类属于http.client模块,该类提供了获取url,状态码、响应内容等一系列方法。
gteurl():用于获取响应内容的url,该方法可以验证发送的HTTP请求是否被重新调配。
info():返回页面的元信息。
getcode():返回HTTP请求的响应状态码。
构造Request对象
当使用urlopen()方法发送一个请求时,如果希望执行更为复杂的操作(如增加HTTP报头),则必须创建一个Request对象来作为urlopen()方法的参数。
使用urllib实现数据传输
在爬取网页时,通过url传递数据给服务器,传递数据的方式主要分为GET和POST两种。这两种方式最大的区别在于:GET方式是直接使用URL访问,在URL中包含了所有的参数;POST方式则不会在URL中显示所有参数。
处理GET请求
处理GET请求通常包括以下步骤:
- 解析URL:获取URL中的查询参数和路径信息。
- 发送请求:使用HTTP协议向指定的URL发送GET请求。
- 接收响应:等待服务器响应,并获取响应数据。
- 处理响应:根据响应的状态码和内容,对响应数据进行解析和处理。
处理POST请求
处理POST请求通常包括以下步骤:
- 接收POST请求:使用适当的库或框架来接收POST请求。这些库和框架可以处理请求的解析和数据的提取。
- 提取数据:从请求中提取所需的数据。这可能包括从请求头、请求体或URL中提取数据。
- 处理数据:对提取的数据进行处理。这可能包括验证数据、转换数据或进行其他必要的操作。
- 执行业务逻辑:根据请求中的数据执行相应的业务逻辑。这可能涉及数据库操作、计算或其他处理。
- 构建响应:根据业务逻辑的结果构建响应。这可能包括生成HTML页面、JSON响应或其他类型的响应。
- 发送响应:将构建的响应发送回给客户端。这可以通过使用HTTP响应代码和适当的响应头来完成。
下面是一个用urllib库爬取百度贴吧
import urllib.request
import urllib.parse
#设置代理
def tieba_spider(url,begin_page,end_page):
for page in range(begin_page,end_page +1):
pn=(page-1)*50
file_name="第"+str(page)+"页.html"
full_url=url+"&pn="+str(pn)
html=load_page(full_url,file_name)
write_page(html,file_name)
def load_page(url,filename):
headers={"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0 windows NT6.1;Trident/5.0;)"}
request=urllib.request.Request(url,headers=headers)
return urllib.request.urlopen(request).read()
def write_page(html,filename):
print("正在保存"+filename)
with open(filename,'w',encoding='utf-8') as file:
file.write(html.decode('utf-8'))
if __name__=="__main__":
kw=input("请输入需要爬取的贴吧名:")
begin_page=int(input("请输入起始页:"))
end_page=int(input("请输入结束页:"))
url='http://tieba.baidu.com/f?'
key=urllib.parse.urlencode({"kw":kw})
url=url+key
tieba_spider(url,begin_page, end_page)