requests
#get 请求 import requests #指定ajax-get请求的url(通过抓包进行获取) url = 'https://movie.douban.com/j/chart/top_list?' #定制请求头信息,相关的头信息必须封装在字典结构中 headers = { #定制请求头中的User-Agent参数,当然也可以定制请求头中其他的参数 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36', } #定制get请求携带的参数(从抓包工具中获取) param = { 'type':'5', 'interval_id':'100:90', 'action':'', 'start':'0', 'limit':'20' } #发起get请求,获取响应对象 response = requests.get(url=url,headers=headers,params=param) #获取响应内容:响应内容为json串 print(response.text) #post请求 #定制post请求携带的参数(从抓包工具中获取) data = { 'cname':'', 'pid':'', 'keyword':'北京', 'pageIndex': '1', 'pageSize': '10' } #发起post请求,获取响应对象 response = requests.post(url=url,headers=headers,data=data) response.text 属性 返回的是字符串类型的页面数据 response.content 属性 返回的是二进制类型的数据 response.json() 方法 json格式的数据
【重点】 - 问题:往往在进行大量请求发送的时候,经常会报出这一样的一个错误:HTTPConnectionPool(host:XX)Max retries exceeded with url。 - 原因: 1.每次数据传输前客户端要和服务器建立TCP连接,为节省传输消耗,默认为keep-alive,即连接一次,传输多次。然而如果连接迟迟不断开的话,则连接池满后则无法产生新的链接对象,导致请求无法发送。 2.ip被封 3.请求频率太频繁 - 解决:如果下列解决未生效,则可以尝试再次执行程序 1.设置请求头中的Connection的值为close,表示每次请求成功后断开连接 2.更换请求ip 3.每次请求之间使用sleep进行等待间隔 headers = { 'User-Agent':ua, #保证http请求成功后,立即断开连接,以解决HTTPConnectionPool(host:XX)Max retries exceeded with url的问题 'Connection': 'close', #该行不写,则会报错 } 数据解析 正则: 单字符: . : 除换行以外所有字符 [] :[aoe] [a-w] 匹配集合中任意一个字符 \d :数字 [0-9] \D : 非数字 \w :数字、字母、下划线、中文 \W : 非\w \s :所有的空白字符包,括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 \S : 非空白 数量修饰: * : 任意多次 >=0 + : 至少1次 >=1 ? : 可有可无 0次或者1次 {m} :固定m次 hello{3,} {m,} :至少m次 {m,n} :m-n次 边界: $ : 以某某结尾 ^ : 以某某开头 分组: (ab) 贪婪模式: .* 非贪婪(惰性)模式: .*? re.I : 忽略大小写 re.M :多行匹配 re.S :单行匹配 re.sub(正则表达式, 替换内容, 字符串) key='[email protected]'#想要匹配到hit. re.findall('h.*?\.',key) 结果是列表 xpath 解析 安装xpath插件在浏览器中对xpath表达式进行验证:可以在插件中直接执行xpath表达式 ; 启动和关闭插件 ctrl + shift + x // 表示所有后代标签 /表示直系的子标签 ./表示当前目录下的直系子标签 []用来匹配 @取属性值如@href @class @src text()取文本 属性定位: #找到class属性值为song的div标签 //div[@class="song"] 层级&索引定位: #找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a ,这里的第二个就是2,不是1 //div[@class="tang"]/ul/li[2]/a 逻辑运算: #找到href属性值为空且class属性值为du的a标签 //a[@href="" and @class="du"] 模糊匹配: //div[contains(@class, "ng")] //div[starts-with(@class, "ta")] 取文本: # /表示获取某个标签下的文本内容 # //表示获取某个标签下的文本内容和所有子标签下的文本内容 //div[@class="song"]/p[1]/text() //div[@class="tang"]//text() 取属性: //div[@class="tang"]//li[2]/a/@href 使用 from lxml import etree 将html文档或者xml文档转换成一个etree对象,然后调用对象中的方法查找指定的节点 本地文件:tree = etree.parse(文件名) tree.xpath("xpath表达式") 网络数据:tree = etree.HTML(网页内容字符串) tree.xpath("xpath表达式") BeautifulSoup解析 pip install bs4 pip install lxml from bs4 import BeautifulSoup - 使用方式:可以将一个html文档,转化为BeautifulSoup对象,然后通过对象的方法或者属性去查找指定的节点内容 (1)转化本地文件: - soup = BeautifulSoup(open('本地文件'), 'lxml') (2)转化网络文件: - soup = BeautifulSoup('字符串类型或者字节类型', 'lxml') (3)打印soup对象显示内容为html文件中的内容 查找 (1)根据标签名查找 - soup.a 只能找到第一个符合要求的标签 (2)获取属性 - soup.a.attrs 获取a所有的属性和属性值,返回一个字典 - soup.a.attrs['href'] 获取href属性 - soup.a['href'] 也可简写为这种形式 (3)获取内容 - soup.a.string 获取a标签直系的文本 - soup.a.text 获取a标签所有后代标签的文本 - soup.a.get_text() 获取a标签所有后代标签的文本 【注意】如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容 (4)find:找到第一个符合要求的标签 - soup.find('a') 找到第一个符合要求的 - soup.find('a', title="xxx") - soup.find('a', alt="xxx") - soup.find('a', class_="xxx") - soup.find('a', id="xxx") (5)find_all:找到所有符合要求的标签 - soup.find_all('a') - soup.find_all(['a','b']) 找到所有的a和b标签 - soup.find_all('a', limit=2) 限制前两个 (6)根据选择器选择指定的内容 select:soup.select('#feng') - 常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器 - 层级选择器: div .dudu #lala .meme .xixi 下面好多级 div > p > a > .lala 只能是下面一级 【注意】select选择器返回永远是列表,需要通过下标提取指定的对象