• pyspider和pyquery总结


    1.参考

    pyspider作者官网:

    pyspider 爬虫教程(一):HTML 和 CSS 选择器

    pyspider 爬虫教程(二):AJAX 和 HTTP

    pyspider 爬虫教程(三):使用 PhantomJS 渲染带 JS 的页面

    CssFullText - CSS选择器 说明

    其他:

    用pyspider写的爬虫几例

    Python爬虫进阶四之PySpider的用法

    Python爬虫利器六之PyQuery的用法

    2.jQuery 语法

    jQuery 是一个 JavaScript 库。jQuery 极大地简化了 JavaScript 编程。
    http://www.w3school.com.cn/jquery/jquery_syntax.asp
    http://www.w3school.com.cn/jquery/jquery_selectors.asp
    http://www.w3school.com.cn/jquery/jquery_ref_selectors.asp

    语法     描述
    $(this)     当前 HTML 元素
    $("p")     所有 <p> 元素
    $("p.intro")     所有 class="intro" 的 <p> 元素
    $(".intro")     所有 class="intro" 的元素
    $("#intro")     id="intro" 的元素
    $("ul li:first")     每个 <ul> 的第一个 <li> 元素
    $("[href]") 选取所有带有 href 属性的元素。
    $("[href='#']") 选取所有带有 href 值等于 "#" 的元素。
    $("div#intro .head")     id="intro" 的 <div> 元素中的所有 class="head" 的元素

    jQuery CSS 选择器可用于改变 HTML 元素的 CSS 属性。!!!!!
    $("p").css("background-color","red");

    3.pyspider相关

    (1) 全局配置,调试时每次修改代码记得更新itag,save,刷新页面再run

    class Handler(BaseHandler):
        crawl_config = {
            'itag': 'v001',
            'headers': {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0'}
        }

     

    (2) response.save用于传递数据

        file_name = 'xxx'
        self.crawl(img.attr.src, callback=self.save_img, save={'file_name': file_name})
    
    def save_img(self,response):
        file_name = response.save['file_name']  #使用传入的数据

     

    (3) 如果返回结果为多项的json,无法每一项返回一个条目。。。

    # https://binux.blog/2015/01/pyspider-tutorial-level-2-ajax-and-more-http/      

    # 我测试返回的数据不是预期(我想每个电影为显示一行)

    # 你想要在界面中显示为多行?这是不行的,results 页面永远只会每个 url 返回一个结果。如果这个结果是一个数组,那么就显示一个数组。

        def json_parser(self, response):
            return [{
                "title": x['title'],
                "rate": x['rate'],
                "url": x['url']
            } for x in response.json['subjects']]

     

    (4) 操作pyspider的response.doc

    xml_doc = '''
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <bookstore>
        <book>
          <title lang="eng">Harry Potter</title>
          <price>29.99</price>
        </book>
        
        <book>
          <title lang="eng">Learning XML</title>
          <price>39.95</price>
        </book>
    </bookstore>'''
    
    from pyquery import PyQuery
    response_doc = PyQuery(xml_doc)  #response_doc即pyspider的response.doc
    
    for each in response_doc('book>title').items():   #括号内部使用CSS选择tag,.items()用来遍历
        print each.attr.lang
        print each.text()
        print 123

    (5) 操作pyspider的response.etree

    html_doc = '''
    <div>
        <ul>
             <li class="item-0">first item</li>
             <li class="item-1"><a href="link2.html">second item</a></li>
             <li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li>
             <li class="item-1 active"><a href="link4.html">fourth item</a></li>
             <li class="item-0"><a href="link5.html">fifth item</a></li>
         </ul>
     </div>'''
        
    import lxml.html  
    response_etree = lxml.html.fromstring(html_doc)   #response_etree即pyspider的response.etree
    
    for each in response_etree.xpath('//ul/li/a'):
        print each.xpath('./@href') #返回列表  [0]可能报错
        print each.text
        print 123
    print     
    for each in response_etree.cssselect('div li a'):
        print each.get('href')  #推荐或返回None
        print each.text 
        print 123    
    print 

    (6) 方便本地调试response.doc 和 response.etree

    url = 'http://movie.douban.com/top250'
    headers={'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0'}
    # response_doc = PyQuery(url,headers=headers)
        
    request = urllib2.Request(url,headers=headers)
    f = urllib2.urlopen(request)
    # Note: this returns a tree, not an element.  Use``parse(...).getroot()`` to get the document root.
    response_etree = lxml.html.parse(f).getroot()    #.getroot() 
            
    for each in response_etree.xpath('//a[contains(@href,"subject")]'):
        print each.xpath('./@href')[0]
    print     
    for each in response_etree.cssselect('a[href*="subject"]'):
        print each.get('href')    
    print 
        
    # pyspider源代码为doc=PyQuery(etree)   
    response_doc = PyQuery(response_etree)
    
    for each in response_doc('a[href*="subject"]').items():
        print each.attr.href
  • 相关阅读:
    Extension Methods(扩展方法)
    linux面试题
    渗透测试 day4
    渗透测试 day3
    渗透测试 day2
    渗透测试 day1
    9.3 网络安全介绍
    9.2 Iptables
    8.30 进程管理
    8.29 linux的网络
  • 原文地址:https://www.cnblogs.com/my8100/p/7208876.html
Copyright © 2020-2023  润新知