Python3编写网络爬虫01-基本请求库urllib的使用
安装python后 自带urllib库
模块篇 分为几个模块如下:
1. urllib.request 请求模块
2. urllib.parse 分析模块
3. urllib.error 异常处理模块
4. urllib.robotparser robots文本协议识别 用的比较少
方法篇 分为以下几种方法:
urlopen()
示例:
import urllib.request response = urllib.request.urlopen("https://www.python.org") print(response.read().decode('utf-8'))
type()方法 read()方法 status 方法 getheaders() getheader('Server')
示例
import urllib.request response = urllib.request.urlopen("https://www.python.org") print(type(response)) print(response.read()) print(response.status) print(response.getheaders()) print(response.getheader('Server'))
参数篇 url data timeout
url 请求的URL地址
data 内容
示例
import urllib.parse
import urllib.request
data = bytes(urllib.parse.urlencode({'name':'hello','pass':'123'}),encoding='utf-8')
response = urllib.request.urlopen('http://www.iqianyue.com/mypost',data=data)
print(response.read())
timeout 请求超时
示例
import urllib.request response = urllib.request.urlopen('httpbin.org/get',timeout=1) print(respons.read()) import socket import urllib.request import urllib.error try: response = urllib.request.urlopen('http://httpbin.org/get',timeout=0.1) except urllib.error.URLError as e: if isinstance(e.reason,socket.timeout): print('TIME OUT')
requests urllib自带的请求模块
示例
import urllib.request request = urllib.request.Request("http://www.baidu.com") response = urllib.request.urlopen(request) print(response.read().decode('utf-8')) add_header quote() 将内容转化为URL编码 unquote() 解码
爬虫爬取百度贴吧实例
import urllib import urllib.request import urllib.parse #百度贴吧爬虫接口 组合url地址 起始页和终止页 def tiebaSpider(url,beginPage,endPage): """ 作用:负责处理 url 分配每一个url去发送请求 :param url: 处理第一个url :param beginPage: 爬虫起始页 :param endPage: 爬虫终止页 :return: null """ for Page in range(beginPage,endPage+1): pn = (Page-1)*50 filename = "第" + str(Page) + "页.html" #组合url 发送请求 fullurl = url + "&pn=" + str(pn) # print fullurl # 调用loadPage()函数发送请求获取HTML页面 html = loadPage(fullurl,filename) # 调用writePage()函数 将服务器响应文件保存到本地磁盘 writeFile(html,filename) def loadPage(url,filename): """ 作用:根据url发送请求 获取服务器响应数据 :param url: 请求地址 :param filename: 文件名 :return:服务器响应文件 """ print("正在下载" + filename) headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"} request = urllib.request.Request(url,headers = headers) response = urllib.request.urlopen(request) return response.read() def writeFile(html,filename): """ 作用:保存服务器文件到本地磁盘 :param html: 服务器文件 :param filename:本地磁盘文件名 :return:null """ print("正在存储" + filename) with open(filename,"wb+") as f: f.write(html) print("-"*20) #模拟main 函数 if __name__ == "__main__": kw = input("请输入要爬取的贴吧名") #输入起始页和终止页 str转化为int类型 beginPage = int(input("请输入爬取的起始页")) endPage = int(input("请输入爬取的终止页")) url = "http://tieba.baidu.com/f?" key = urllib.parse.urlencode({"kw":kw}) #组合后的url示例 http://tieba.baidu.com/f?kw=lol url = url + key tiebaSpider(url,beginPage,endPage)
作业:
page 页码 不出现负数
去贴吧帖子下级目录 里面获取信息
# str为字符串
# str.isalnum() 所有字符都是数字或者字母
# str.isalpha() 所有字符都是字母
# str.isdigit() 所有字符都是数字
# str.islower() 所有字符都是小写
# str.isupper() 所有字符都是大写
# str.istitle() 所有单词都是首字母大写,像标题
# str.isspace() 所有字符都是空白字符、\t、\n、\r
beginPage = input('请输入开始页(整数): ') while True: if beginPage.isdigit(): if int(beginPage) <= 0: beginPage = 1 break else: beginPage = int(beginPage) break else: beginPage = input('请重新输入开始页(整数):')