• 11_26爬虫find与findall


    一。使用json

      正常的,如果需要将response结果序列化,需要将结果json.loads

    res1=json.loads(response.text)

      但是这样会很麻烦,request提供了json方法:

    res2=response.json() #直接获取json数据

      

    二。SSL认证

      ssl就是http+SSL,也就是https。需要带上证书才能访问特定的网站。

      证书需要浏览器下载。

    #SSL
    # https=http+ssl
    import requests
    respone=requests.get('https://www.12306.cn',
                         cert=('/path/server.crt',
                               '/path/key'))
    print(respone.status_code)

    三。使用代理

      在get请求中proxies关键字就是存放代理网址,:(西刺)

      通过META.get('REMOVE_ADDR')

    import reques1ts
    proxies={
        'http':'http://egon:123@localhost:9743',#带用户名密码的代理,@符号前是用户名与密码
        'http':'http://localhost:9743',
        'https':'https://localhost:9743',
        'http':'http://124.205.155.148:9090'
    }
    respone=requests.get('https://www.12306.cn',
                         proxies=proxies)
    
    print(respone.status_code)

    四。超时设置

      

    import requests
    respone=requests.get('https://www.baidu.com',
                         timeout=0.0001)

    五。 上传文件。

    import requests
    files={'file':open('a.jpg','rb')}
    respone=requests.post('http://httpbin.org/post',files=files)
    print(respone.status_code)

      另外有检测服务器压力的工具

      jmter 压力测试工具

    六。使用bs4

      使用插件bs4,可以快速匹配页面中的元素。

      首先需要下载bs4和lxml

    pip install lxml
    
    pip install html5lib
    
    pip install beautifulsoup

      使用时首先需要将数据爬取,并生成Beautiful对象

    import requests
    from bs4 import BeautifulSoup
    url='https://www.autohome.com.cn/news/1/#liststart'
    res=requests.get(url)
    soup=BeautifulSoup(res.text,'lxml')

      再者使用基本用法find,获取一个对象,其中的筛选条件是系与id,name等例子:

    div=soup.find(id='auto-channel-lazyload-article')
    ul=div.find(name='ul')  
    li_list=ul.find_all(name='li')
    # print(len(li_list))
    for li in li_list:
        h3=li.find(name='h3')
        if h3:
            title=h3.text  #把h3标签的text取出来
            print(title)
        a=li.find(name='a')
        if a:
            article_url=a.get('href')  #取出a标签的href属性
            print(article_url)
    
        img=li.find(name='img')
        if img:
            img_url=img.get('src')
            print(img_url)
        p=li.find(name='p')
        if p:
            content=p.text
            print(content)

      findall则是将所有元素都找到。

      总结:

      find:

      -name="标签名" 标签

      -id,class_,="" 把这个标签拿出来

      -标签.text 取标签的内容

      -标签.get(属性名) 取标签属性的内容

      find_all

    其他用法:

    from bs4 import BeautifulSoup
    html_doc = """
    <html><head><title>The Dormouse's story</title></head>
    <body>
    
    <p class="title" id="bbaa"><b name="xx" age="18">The Dormouse's story</b><b>xxxx</b></p>
    <p class="xxx" a="xxx">asdfasdf</p>
    
    <p class="story">Once upon a time there were three little sisters; and their names were
    <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>
    <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
    <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
    and they lived at the bottom of a well.</p>
    
    <p class="story">...</p>
    """
    soup=BeautifulSoup(html_doc,'lxml')
    ress=soup.prettify() #美化一下
    soup=BeautifulSoup(ress,'lxml')

      通过该对象点标签可以直接对其进行操作:

    #遍历文档树
    # print(soup.p.name) # 获取该对象中的标签名字
    # print(soup.p.attrs) # 获取该对象中的属性集合
    # print(soup.p.string)  # 获取标签中的字
    # print(list(soup.p.strings))  # 迭代器
    # print(soup.p.text) # 所有
    # print(soup.p.b)
    # print(soup.body.p.text) # 只识别文本呢
    # print(soup.body.p.contents)    #生成期中的所有元素
    # print(list(soup.body.p.children))  # 迭代器生成期中的所有元素
    # print(list(soup.body.p.descendants))  # 迭代器输出所有孩子
    # print(soup.body.p.parent)  # 输出p的父标签所有的元素
    # print(list(soup.body.p.parents))  # 取出所以有父节点
    # print(len(list(soup.body.p.parents)))
    # print(soup.body.p.previous_sibling)  # 他的上一个兄弟
    # print(soup.body.p.previous_sibling)
    # print(soup.find(class_="xxx").previous_sibling)
    # print(soup.p.next_sibling) # 下一个兄弟
    # print(soup.a.previous_sibling)
    # print(type(soup.p))

      查找文档法:

      一共有五种过滤器:字符串,正则,布尔,方法,列表

      1.通过字符串过滤:

    # print(soup.find_all(name='b'))

      2.通过正则过滤

    # print(soup.find_all(name=re.compile('^b')))
    # print(soup.find_all(id=re.compile('^b')))

      3.通过列表与布尔值:

    # print(soup.find_all(name=['a','b']))
    # print(soup.find_all(name=True))

      4.通过方法:

    # def has_class_but_no_id(tag):
    #     return tag.has_attr('class') and not tag.has_attr('id')
    # print(soup.find_all(name=has_class_but_no_id))

      css选择器法:

    # print(soup.select(".title"))
    # print(soup.select("#bbaa"))
    #
    print(soup.select('#bbaa b')[0].attrs.get('name'))
    
    

      其他用法:

    #recursive=False  只找同一层
    #limit  找到第几个之后停止

    七。通过测试软件自动点网站。

      1.安装selenium模块:

    pip install selenium

      2.安装插件到项目文件夹下或者puthon下的scripts中,需要核对版本信息。:
    http://npm.taobao.org/mirrors/chromedriver/78.0.3904.105/

      使用:

    from selenium import webdriver
    bro=webdriver.Chrome()
    bro.get('https://www.baidu.com')
    time.sleep(3)
    bro.close()

      无窗口操作:

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys #键盘按键操作
    import time
    
    from selenium.webdriver.chrome.options import Options
    chrome_options = Options()
    chrome_options.add_argument('window-size=1920x3000') #指定浏览器分辨率
    chrome_options.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug
    chrome_options.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面
    chrome_options.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度
    chrome_options.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
    chrome_options.binary_location = r"C:Program Files (x86)GoogleChromeApplicationchrome.exe" #手动指定使
    bro=webdriver.PhantomJS()
    
    bro=webdriver.Chrome(chrome_options=chrome_options)
    bro=webdriver.Chrome()
    bro.get('https://www.baidu.com')

      chrome支持无窗口操作。

      自动化控制窗口:

    bro=webdriver.Chrome()
    bro.get('https://www.baidu.com')
    
    # print(bro.page_source)
    # time.sleep(3)
    time.sleep(1)
    #取到输入框
    inp=bro.find_element_by_id('kw')
    #往框里写字
    inp.send_keys("美女")
    inp.send_keys(Keys.ENTER) #输入回车
    #另一种方式,取出按钮,点击su
    time.sleep(3)
    bro.close()
  • 相关阅读:
    python习题-用交集方式产生随机密码
    python习题-产生8位随机密码要包含大小写及数字
    python习题-替换敏感词
    python习题-注册用户程序
    Python习题-登录
    Python习题-统计日志中访问次数超过限制的IP
    PyCharm配置过程记录
    jmeter 多压力机并发测试过程
    Jmete基础使用
    Linux 中直接 I/O 机制的介绍
  • 原文地址:https://www.cnblogs.com/LZXlzmmddtm/p/11938579.html
Copyright © 2020-2023  润新知