python 爬虫

1.urllib 使用

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()
记住常用的获取属性和文本值的方法


 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值