2.urllib进阶
3.requests 使用
4.re 解析 xpath bs4(beautifulsoup) jsonpath 等 太简单就不写了
urllib使用
urllib 有以下模块
request --请求
response --响应
error --异常
parse --解析库
import urllib.request
*******************************request常用方法**************************************
# 参数解释 headers 可定义自己的请求头 如 UA
列 headers={'User-Agent':'Mozilla/5.0'}
origin_req_host 远程地址unverifiable 验证
0. Request 对象
def __init__(self, url, data=None, headers={},
origin_req_host=None, unverifiable=False,
method=None):
# 参数解释 data 可以放编码过后的数据
1.urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT)
# 下载远程资源 filename 本地路径
2.urlretrieve(url, filename=None, reporthook=None, data=None)
********************************
发送get请求 urlopen(url,headers=headers)
发送post请求 只需要加data就是post urlopen(url,headers=headers,data={'k1':'v1'})
********************************
########################################################################
"""
爬取猫眼榜单 前100 (电影名称 主演 上映时间 评分)
"""
import re
from threading import Thread, BoundedSemaphore, current_thread
from urllib import request, parse
sema = BoundedSemaphore(5) # 有边界的信号量
headers = {
'User-Agent': 'Mozilla/5.0',
}
def run():
for i in range(10):
sema.acquire() #最多10个线程拿到锁
Thread(target=cathc_html, args=(i * 10,)).start()
def cathc_html(offeset):
"""抓取html源码"""
url = 'https://maoyan.com/board/4?offset=' + str(offeset)
request_obj = request.Request(url=url, headers=headers)
response_obj = request.urlopen(request_obj)
parse_html(response_obj)
def parse_html(response_obj):
"""解析数据"""
html = response_obj.read().decode()
pattern = r'.*?<p class="name">.*?<a.*?>(.*?)</a>.*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>.*?<p class="score"><i class="integer">(.*?)</i><i class="fraction">(.*?)</i></p>'
match_data = re.findall(pattern, html, re.S)
match_data = [list(i) for i in match_data]
# 处理字符串
for j in match_data:
res = j.pop()
j[-1] += res
print(match_data)
print("*" * 200)
print(current_thread().name)
print("*" * 200)
sema.release() # 放锁
if __name__ == '__main__':
run()
******************************************response常用方法*************************
from urllib.response
1.response.read() 返回html ---- 注意只能读一次在此response为空 这东西感觉像似管道取完就没了 和 flask的flush相似
2.response.info 返回 return self.headers 请求头
3.request.code 返回状态码 return self.code
4.request.url 返回请求的url return self.url
********************************************error******************************
from urllib.error
主要是两个异常类 用户捕捉异常
1.urllib.error.HTTPError # 响应码 有关 404 500等
2.urllib.error.URLError # url错误
###############################
伪代码 HTTPError 继承于 URLError
try:
xxxxxxxxxxxx
except urllib.error.HTTPError as e:
print(e)
except urllib.error.URLError as e:
print(e)
*********************************************parse解析************************
import urllib.parse
# 将中文编码 http://www.baidu.com/s?wd='最帅的帅'
# 变成http://www.baidu.com/s?wd=%E6%9C%80%E5%B8%85%E7%9A%84%E5%B8%85
1.urllib.parse.quote(字符串)
# 与上面的相反
2. urllib.parse.unquote(编码后的中文)
3. urllib.parse.urljoin 用户url拼接 很少使用
# urllib.parse.urlencode({'xx萨达x':123})------>xx%E8%90%A8%E8%BE%BEx=123 # 编后的数据可用于 urlopen 中的data参数
4. urllib.parse.urlencod(字典)
# 用于解析 参数
5.urllib.parse.parse_qs(query_string) #xxx=3512&dfsdf=31231 返回 {'xxx':['3512'],'dfsdf':['31231']}
urllib进阶
******************cookie 代理ip 使用**********************************
"""
cookie 的设置
"""
import urllib.request
import urllib.parse
from urllib.request import build_opener, HTTPCookieProcessor
from http.cookiejar import CookieJar
cookie = CookieJar()
handler = HTTPCookieProcessor(cookie)
url = 'https://www.baidu.com/'
opener=build_opener(handler)
# 使用opner发送请求
response=opener.open(url)
for c in cookie:
print(c)
*************代理ip
"""
设置代理
"""
import urllib.request
import urllib.parse
from urllib.request import build_opener,ProxyHandler
proxies={
'http':'127.0.0.1:8080',
'https':'代理ip:端口'
}
url = 'https://www.baidu.com/'
handler=ProxyHandler(proxies)
opener=build_opener(handler)
# 使用opner 进行发送请求
response=opener.open(url)
requests使用
"""
方法及属性
response = requests.get('http://www.baidu.com') # 发送get请求
print(response.status_code) # 打印状态码
print(response.url) # 打印请求url
print(response.headers) # 打印头信息
print(response.cookies) # 打印cookie信息
print(response.text) #以文本形式打印网页源码
print(response.content) #以字节流形式打印
print(response.json()) #返回json数据
"""
# 各种请求方式
import requests
requests.get('http://httpbin.org/get')
requests.post('http://httpbin.org/post')
requests.put('http://httpbin.org/put')
requests.delete('http://httpbin.org/delete')
requests.head('http://httpbin.org/get')
requests.options('http://httpbin.org/get')
# 加headers
requests.get(url,headers=headers)
# 发送get请求 和 post请求
requests.get(url,headers=headers)
requests.post(url ,headers=headersm,data=data)
# requests异常模块
requests.exception
# 使用session 获取session对象来发送请求
session=requests.Session()
session.get()
session.post()
re解析
测试HTML
html="""<div class="article-item-box csdn-tracking-statistics" style="display: none;" data-articleid="82762601">
<h4 class="">
<a href="https://blog.youkuaiyun.com/yoyo_liyy/article/details/82762601" target="_blank">
<span class="article-type type-1">原</span>帝都的凛冬</a>
</h4>
<p class="content">
<a href="https://blog.youkuaiyun.com/yoyo_liyy/article/details/82762601" target="_blank">
各种AI、人工智能、大数据如秋日凉爽的风,杳然erzhi;区块链的风头得到短暂的下降。
此次山竹台风造成了多少伤亡和破坏?人民的生命和财产遭受重大损失
</a>
</p>
<div class="info-box d-flex align-content-center">
<p>
<span class="date">2019-05-23 21:39:20</span>
</p>
<p>
<span class="read-num">阅读数:13</span>
</p>
<p>
<span class="read-num">评论数:2</span>
</p>
</div>
</div>"""
import re
# 中间那段字符串 各种AI、人工智能....
# re 匹配html精华-----> (.*?) 解决一切 用括号包起来你想要的内容
content=re.findall(r'(.*?)<p class="content">.*?<a href.*?>(.*?)</a>')
xpath 太简单了
bs4
安装
pip install beautifulesoup4
# 使用
from bs4 import BeautifulSoup
# html 为一个字符串格式 'lxml'一个解析器
soup=BeautifulSoup(html,'lxml')
# 普通找标签
print(soup.title)# 找title标签
print(soup.title.name) # 找title标签的名称
print(soup.title.string)# 获取title的内容
print(soup.title.parent.name)# 获取title父标签的名称
print(soup.p)# 获取html的p标签
print(soup.p["class"]) # 获取p标签的class属性的值
print(soup.p.attrs["class"])## 获取p标签的class属性的值 同上一样
print(soup.a) # 获取a标签
print(soup.find_all('a')) # 找到所有的a标签
print(soup.find(id='link3'))# 找id=link3 的标签
# 选择器
soup.find_all('ul')[0] # 找所有的ul 标签
soup.find_all(text='Foo')结果返回的是查到的所有的text='Foo'的文本
print(soup.select('.panel .panel-heading'))# 查询class=panel 下面的panel-heading
print(soup.select('ul li')) # 找 ul 下面的li
print(soup.select('#list-2 .element')) 找 id=list-2 下面class=element
print(type(soup.select('ul')[0]))找ul
text() 获取节点里面的文本
总结 我觉写的很好
推荐使用lxml解析库,必要时使用html.parser
标签选择筛选功能弱但是速度快
建议使用find()、find_all() 查询匹配单个结果或者多个结果
如果对CSS选择器熟悉建议使用select()
记住常用的获取属性和文本值的方法