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

  • 相关阅读:
    剑指Offer-30.连续子数组的最大和(C++/Java)
    剑指Offer-29.最小的K个数(C++/Java)
    UVA 1616 Caravan Robbers 商队抢劫者(二分)
    UVA 10570 Meeting with Aliens 外星人聚会
    UVA 11093 Just Finish it up 环形跑道 (贪心)
    UVA 12673 Erratic Expansion 奇怪的气球膨胀 (递推)
    UVA 10954 Add All 全部相加 (Huffman编码)
    UVA 714 Copying Books 抄书 (二分)
    UVALive 3523 Knights of the Round Table 圆桌骑士 (无向图点双连通分量)
    codeforecs Gym 100286B Blind Walk
  • 原文地址:https://www.cnblogs.com/xingnie/p/9683432.html
Copyright © 2011-2022 走看看