zoukankan      html  css  js  c++  java
  • crawler 听课笔记 碎碎念 1 初步了解各种选择器极其简单的使用

    css中

    身份证  id对应#

    衣服      class对应 . 

    图片

    pyquery。。。as pq

    html= request.get(url=''.....'')

    doc=pq(html)

    doc("#dq_list > li").items()          tems()拿到所有子元素

    for item in items:

        url= item.find('img').attr("lz_src")

        url_content= requests.get(url= url).content

       name= item.find('.kp-name').text()

     with open("./xxxxx")+name+".jpg","wb")as f:

          file.write(url_content)

    马赛克合成工具foto

    css选择器

    1.元素选择器    直接选择文档元素,如head p 这些

    2.类选择器     对<h1 class="important">,类名就是important  .important就是选择所有这个类属性的元素     可结合元素选择器,比如p.important

    3.id选择器     对<h1 id="intro">  id就是important  #intro就是选择id=intro的元素     可结合元素选择器,比如p.#intro

               类选择器可以全局共享,但是i同一d一个文档只能出现一次,是全局唯一的,不能使用单词列表

               与类选择器一样都区分大小写

    4.属性选择器    选择有某一个属性的元素,而不论值是什么  *[title]选择所有包含title的元素   a[herf]选择所有带有href属性的锚元素

              可以选择多个元素a[herf][title]这里是and属性,要同时满足  

              限定值a[href="www.baidu.com"]

    5.后代选择器    选择某一个元素后代的元素(在层级上面没有限制)      h1 em

    6.子元素选择器    范围限制在子元素                    h1 > strong

    Xpath

    基本节点:元素、属性文本、命名空间、处理指令、注释以及根节点

    节点之间的关系:父  子 兄弟 先辈  后代

    nodename选取此节点的所有子节点

    /从根节点选取

    //从匹配的当前的节点选择文档中的节点,不考虑它们的位置

    .选取当前节点

    ..选取当前节点的父节点

    @选取属性

    Xpath的谓语很强大,写在[]里面

    /bookstore/book[1]选第一个book元素

    /bookstore/book[last()]最后一个book元素

    /bookstore/book[position()<3]选前两个

    //title[@lang]选择的所有有名字为lang的属性的title属性

    /bookstore/book[price>35.00]

    Json 让xml简单化

    import jason

    obj = {'one':1,'two':2,'three':[1,2,3]}

    encoded= jason.dumps(obj)               变成str

    decoded= json.loads(encoded)          变成dict

     xml处理

    1.DOM方法 整个读取  量小的话还行,但是性能其实很慢

    from xml.dom import minidom
    
    doc = minidom.parse('book.xml')
    root = doc.documentElement
    
    print(root.nodeName)
    books = root.getElementsByTagName('book')
    for book in books:
        titles = book.getElementsByTagName('book')   #这里拿到的是一个数组
        title = titles[0].childNodes[0].nodeValue
        print(title)

    2.SAX流模式 边读边解析  层级关系必须自己弄 在数据库中用的比较多吧

    import string
    from xml.parsers.expat import ParserCreate
    
    class DefaultSaxHandler:
        def start_element(self,name,attrs):
            self.name = name
            print('elements:%s, attrs: %s'%(name,str(attrs)))
        def end_element(self,name):
            print('end elements:%s')%name)
        def end_element(self,name):
            if text.strip()
                print("%S's text is %s")%(self.name,text))
    
    handler = DefaultSaxHandler()
    parser= ParserCreate()
    parser.StartElementHandler = handler.start_element  #<book>
    parser.EndElementHandler = handler.end_element  #</book>
    parser.CharacterDataHandler = handler.char_data #<title>character</title>
    with open('book.xml','r') as f:
      parser.Parser(f.read())

    正则表达式

    基本匹配规则 不多复述

    一些规则:

    *匹配前面的字符或者表达式0词或者多次

    +匹配前一个字符至少一次

    ?匹配前一个字符至少0次或者1次

    ^匹配字符串开头

    $匹配字符串结束

    import re
    
    
    mr= re.match(r'd{3}-d{3,8}','010-223456')
    print(mr.string)
    
    m = re.match(r'(d{3}-d{3,8})$','010-223456')
    print(mr.groups())
    print(mr.group(0))    #原始字符串
    
    t ='20:15:45'
    m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9]):(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$',t)

    print(m.groups())
    #分割字符串
    p= re.complie(r'd+')    #先写好匹配的路径,生成python对象
    print(p.split('one1two22three333'))

     selenium简单爬虫使用

    主要是运用以下的两个代码来爬取数据,其他的相关基本设置就看一下下面的案例

    find_element(s)_by_tag_name 

    find_element(s)_by_css_selector

    improt time
    from selenium import webdriver
    
    browser = webdriver.Chrome()
    browser.set_page_load_timeout(30)    
    
    browser.get('xxxxxxxxxxxxxxxxx')
    page_info = browser.find_element_by_csss_selector('这里贴谷歌网页中的css路径')
    #目标信息假设是  共48页,每页24条
    pages = int((page_info.text.split(', ')[0]).split(' ')[1]) #这样就取到了48这个数字
    print('商品一共有%d页'%pages)
    for i in range(pages):
        if i >2:
            break
        url = ' xxxxxxxxxxxxx'+str(i+1)
        browser.get(url)
        browser.execute_script("windows.scrollTo(0,document.body.scrollHeight);")
       time.sleep(2
    )
      goods = browser.find_element_by_css_selector("xxxx主标签xxxx").find_elements_by_tag_name('li')
      print('第%d页有%d件商品'%((i+1),len(goods))
      for good in goods:
          try:
            title = good.find_element_by_css_selector('.....').text
            price = good.find_element_by_css_selector('.....').text
            print(title,price)
          except:
            print('ERROR')

     但是我们也会发现,每一次爬取的时候都会跳出自动运行的浏览器

    这其实是可以避免的,详细的可以参考我的学习笔记

    https://www.cnblogs.com/xingnie/p/9328065.html

  • 相关阅读:
    MySQL Replication主从复制
    使用Amoeba 实现MySQL DB 读写分离
    Amoeba For MySQL入门:实现数据库水平切分
    11条理由告诉你,为什么你的网站不卖座
    很有用的观察者设计模式
    Apache + Tomcat集群配置详解 (1)
    Nginx+tomcat配置负载均衡
    JSON-RPC轻量级远程调用协议介绍及使用
    nginx的upstream目前支持5种方式的分配
    rpc远程过程协议调用
  • 原文地址:https://www.cnblogs.com/xingnie/p/9683432.html
Copyright © 2011-2022 走看看