1.requests 安装: -pip install requests 确认requests是否安装成功 -import requests eg : -import requests r = requests.get("htpp://www.baidu.com")# 获取百度 r.status_code #状态码 返回值 :200 说明 请求成功 t.encoding = 'utf-8' t.text #打印百度的html网页的代码 -- html 代码 --2.get方法: r =requests.get(url) request.get(url,params=None, **kwargs) url: 拟获取页面的url的链接, params: url中的额外参数,字典或字节流格式,可选 ** kwargs 可选的3.Response 对象: -属性: r.status_code:http请求的返回状态,200表示链接成功, 404表示连接失败 t.text; http响应内容的字符串形式, 即, url对应的页面内容\ r.encoding:从http header中猜测的响应内容编码方式, r.apparent_encoding: 从内容分析出的响应内容编码方式(备选编码方式) r.content :http响应内容的二进制形式4.requests库的异常: requests.ConnectionError:网络连接错误异常,如DNS查询失败,拒绝链接等 requests.HTTPError:HTTP错误异常 requests.URLRequired:URL缺失异常 requests.TooManyRedirects:超过最大重定向次数,产生重定向异常 requests.ConnectTimeout:链接远程服务器超时异常 requests.Timeout:请求URL超时, 产生超时异常 r.raise_for_status():如果是200, 产生异常requests.HTTPError -爬取网页的通用代码的框架: import requests def getHTMLText(url): try: r = requests.get(url, timeout=30) r.raise_for_status()#如果状态不是200, 引发HTTPError异常 r.encoding = r.apparent_encoding return r.text except: return "产生异常" if __name__=="__main__": url="http://www.baidu.com" print(getHTMLText(url))requests库的head()方法: r=requests.head("http://httpbin.org/get") r.headersrequests库的post()方法: payload={'key1':'value1', 'key2':'value2'} r = requests.post("http://httpbin.org/post", data=payload) print(r.text)5.Requests 库的7个方法:requests.request():构造一个请求,支撑以下各个方法的计出方法requests.get():获取HTML网页的主要方法, 对应HTTP的GETrequests.head():获取HTML网页头信息的方法, 对应于HTTP的HEADrequests.post():向html网页提交post请求的方法, 对应HTTP的POSTrequests.put():向html网页提交PUT请求的方法, 对应HTTP的PUTrequests.patch():向html网页提交局部修改请求, 对应HTTP的PATCHrequests.delete():向html页面提交删除请求,对应于HTTP的DELETErequests.request(method, url, **kwargs) -method:请求方式, 对应get/post/put等7种 -url:拟获取网页的url链接 **kwargs:控制访问的参数,共13个 -13个参数: --params:字典或者序列, 作为参增加到url中 kv={'key1':'value1', 'key2':'value2'} r = requests.request("GET", 'http://python123.io/ws', params=kv) print(r.url) 返回值 ---- >>>https://python123.io/we?key1=value1&key2=value2 ----- --data:字典, 字节序列或文件对象, 作为Request的内容 kv={'key1':'value1', 'key2':'value2'} r = requests.request("GET", 'http://python123.io/ws', data=kv) body='主体内容' r = requests.request("POST", 'http://python123.io/ws', data=body) --json:json格式数据,作为Request的内容 kv = {'key1':'value1'} r=requests.request('POST', 'http://python123.io/ws', json=kv) --headers:字典, http定制头 hd={'user-agent':'Chrome/10'} r=requests.request('POST', 'http://python123.io/ws', headers=hd) --cookies:字典或CookieJar, Request中的cookie --auth:元组, 支持HTTP认证功能 --file:字典类型,传输文件 fs = {'file':open('data.xls','rb')} r = requests.request('POST', 'http://python123.io/ws', file=fs) --timeout:设定超时时间,秒为单位 r = requests.request('GET', 'http://python123.io/ws',timeout=10) --proxies:字典类型, 设定访问代理服务器, 可以增加登录认证 pxs = {'http':'http://user:pass@10.10.10.1:1234' 'https://10.10.10.1:4321' } r=requests.request('GET','http://www.baidu.com', proxies=pxs) --allow_redirects:True/False, 默认为True, 重定向开关 --stream:True/False, 默认为True, 获取内容立即下载开关 --verify:True/False, 默认为True, 认证SSL证书开关 --cert:本地SSL证书路径Robots协议: Robots Exclusion Standard 网络爬虫排除标准 作用:网站告知网络爬虫那些页面可以抓取, 那些不行 形式:在网站的根目录下 --Robots协议的使用: 网络爬虫:自动或人工识别robots.txt, 在进行内容爬取 --约束性:Robots协议是建议但非约束性, 网络爬虫可以不遵守, 但是存在法律风险---图片下载与保存:import requestsr=requests.get(url)with open(path, 'wb') as f: f.write(r.content)=================================IP地址的查询:------ -----------------------import requestsurl = 'http://m.ip138.com/ip.asp?ip='try: r = requests.get(url+'202.204.80.112') r.raise_for_status() r.encoding = r.apparent_encoding print(r.text)except: print('爬取失败!')===============-------------------------beautifulsoup4的安装: -pip install beautifulsoup4BeautifulSoup测试:-----------------------import requestsr=requests.get('http://python123.io/ws/demo.html')print(r.text)demo=r.textfrom bs import BeautifulSoupsoup = BeautifulSoup(demo, 'html.parser')print(soup.prettify())=======================6. BeautifulSoup 库的理解======================= --解析,遍历,维护,"标签树"的功能库 ==Beautiful Soup 类的基本元素 --Tag:标签, 最基本的信息组织单元, 分别用<>和</>标明开头和结尾 --Name:标签的名字,<p>……</p>的名字是'p', 格式:<tag>.name --Attributes:标签的属性, 字典形式组织, 格式:<tag>.attrs --NavigableString:标签内非常属性字符串,<>…</>中字符串吗格式:<tag>.string --Comment:标签内字符串的注释部分, 一种特殊的Comment类型 ==标签树的下行遍历 .content:子节点的列表, 将<tag>所有儿子节点存入列表 .children:子节点的迭代类型,与.content类似, 用于循环遍历儿子节点 .descendants:子孙节点的迭代类型,包含所有的子孙节点,用于循环遍历 ==标签树的上行遍历 .parent:节点的父亲标签 .parents:节点先辈标签的迭代类型,用于循环遍历先辈节点 ==标签树的平行遍历 .next_sibling:返回按照HTML文本顺序的下一个平行节点标签 .previous_sibling:返回按照HTML文本顺序的上一个平行节点标签 .next_siblings:迭代类型, 返回按照HTML文本顺序的后续所有平行的节点 .previous_siblings:迭代类型,返回按照HTML文本顺序的前续所有平行节点标签======== .prettify()========--信息标记的三种形式: --信息的标记: --标记后的信息可形成信息组织结构,增加信息维度 --标记后的信息可用于通信、存储或展示 --标记的结构与信息一样具有重要的价值, --标记的信息更利于程序的理解胡运用 ===== HTML知识: ………… Xml 信息标记语言 json:有类型的键值对 (key:value) YAML:无类型的键值对 (没有双引号"") --"|" 表达整块数据 # 表注释 ===== 信息提取的一般方法: 方法一: 完整解析信息的标记形式,在提取关键信息 XML JOSN YAML 需要标记解析器, 例如:bs4的标签树的遍历 方法二: 五十标记形式, 直接搜索关键信息 搜索 ---对信息的文本查找函数即可, 优点:提取过程简洁,速度较快 缺点,提取结果准确性与信息内容相关========代码: =========================================================import requestsr=requests.get('http://python123.io/ws/demo.html')print(r.text)demo=r.textfrom bs4 import BeautifulSoupsoup = BeautifulSoup(demo, "hrml.parser")for link in soup.find_all('a'): print(link.get('href'))========================================================= -- <>.find_all(name, attrs,recursive, string, **kwargs) 返回一个列表类型, 存储查找结果, --name:对标签名称的检索字符串。 --attrs:对标签属性值的检索字符串,可标注属性检索。 --recursive:是否对子孙全部检索,默认True --string:<>…</>中字符串区域的检索字符串=========================================================url:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html功能描述: -输入:大学的URL链接 -输出:大学排名信息的屏幕输出(排名, 大学名称, 总分) -技术路线:requests-bs4 -定向爬虫:仅对输入url进行爬取, 不扩展爬取程序的结构设计: -步骤1:从网络上获取大学排名网页内容 -- getHTMLText() -步骤2:提取网页内容中信息到合适的数据结构 -- fillUnivList() -步骤3:利用数据结构战术输出结果 --:printUnivList()代码:=========================================================================import requestsimport bs4from bs4 import BeautifulSoupdef getHTMLText(url): try: r = requests.get(url, timeout=30) r.raise_for_status() r.encoding = r.apparent_encoding return r.text except: return ""def fillUnivList(ulist, html): soup = BeautifulSoup(html, "html.parser") for tr in soup.find('tbody').children: if isinstance(tr, bs4.element.Tag): tds = tr('td') ulist.append([tds[0].string, tds[1].string, tds[3].string])def printUnivList(ulist, num): print("{:^10}\t{:^6}\t{:^10}".format("排名", "学校", "评分")) for i in range(num): u = ulist[i] print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2]))def main(): uinfo = [] url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html" html = getHTMLText(url) fillUnivList(uinfo, html) printUnivList(uinfo, 20)if __name__ == '__main__': main()=========================================================================中文对齐问题的解决: 采用中文字符的空格填充 chr(12288)========================================def printUnivList(ulist, num): tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}" print(tplt.format("排名", "学校", "总分", chr(12288))) for i in range(num): u = ulist[i] print(tplt.format(u[0], u[1], u[2], chr(12288) ))=========================================================7.正则表达式: regular expresson regex RE 正则表达式是用来简洁表达一组字符串的表达式 -通过的字符串表达框架 -简洁表达一组字符串的表达式 -针对字符串表达“简洁”和“特征”思想的工具 -判断某字符串的特征归属 正则表达式在文本处理中十分常用 -表达文本类型的特征(病毒、入侵等) -同时查找或替换一组字符串 -匹配字符串的全部或部分 正则表达式的使用 -编译:将符合正则表达式语法的字符串转换成正则表达式特征 正则表达式的语法: 正则表达式语由字符和操作符构成RE库的介绍: RE库是Python的标准库, 主要用于字符串匹配。 调用方式: import re 正则表达式的表示类型 -raw string类型(原生字符串类型--- 不包含转义符的字符串) * re库采用raw string类型表示正则表达式, 表示为“r.text” * string 类型, 更繁琐 RE库主要的功能函数: -re.search():在一个字符串中搜索匹配正则表达式的第一个位置, 返回match对象 *re.search(pattern, string, flags=0) -pattern: 正则表达式的字符串或原生字符串表示 -string:待匹配的字符串 -flags:正则表达式使用时的控制标记 -re.match():从一个字符串的开始位置起匹配正则表达式, 返回match对象 *re.match(pattern, string, flags=0) -pattern: 正则表达式的字符串或原生字符串表示 -string:待匹配的字符串 -flags:正则表达式使用时的控制标记 -re.findall():搜索字符串, 以列表类型返回全部能匹配的子串 *re.findall(pattern, string, flags=0) -pattern: 正则表达式的字符串或原生字符串表示 -string:待匹配的字符串 -flags:正则表达式使用时的控制标记 -re.split():将一个字符串按照正则表达式匹配结果进行分割, 返回列表类型 *re.split(pattern, string,maxslplit=0, flags=0) -pattern: 正则表达式的字符串或原生字符串表示 -string:待匹配的字符串 -maxslplit:最大分割数, 剩余部分作为最后一个元素输出 -flags:正则表达式使用时的控制标记 -re.finditer():搜索字符串, 返回一个匹配结果的迭代类型,每个迭代元素是match对象 *re.finditer(pattern, string, flags=0) -pattern: 正则表达式的字符串或原生字符串表示 -string:待匹配的字符串 -flags:正则表达式使用时的控制标记 -re.sub():在一个字符串中替换所有匹配正则表达式的字串, 返回替换后的字符串 *re.sub(pattern, replstring, coount=0,flags=0) -pattern: 正则表达式的字符串或原生字符串表示 -repl:替换匹配字符串的字符串 -string:待匹配的字符串 -count:匹配的最大替换次数 -flags:正则表达式使用时的控制标记=======================================================================淘宝商品比价定向爬虫 示例编写=================================================================功能描述: *目标:获取淘宝搜索页面的信息,提取其中的商品名称和价格。 *理解:淘宝的搜索接口。 -翻页的处理: *定向爬虫可行性 robots.txt程序的结构设计 步骤1:提交商品搜索的请求,循环获取页面。 步骤2:对于每个页面, 提取商品名称和价格信息 步骤3:将信息输出到屏幕上
来源:https://www.cnblogs.com/nori/p/12243508.html