zoukankan      html  css  js  c++  java
  • 商业爬虫学习笔记day6

    一. 正则解析数据

    解析百度新闻中每个新闻的title,url,检查每个新闻的源码可知道,其title和url都位于<a></a>标签中,因为里面参数的具体形式不一样,同一个正则并不能匹配并提取所有新闻的标题和url,如下图

     target为确定值,在正则中可以写死,class也为确定值,在正则中也可写死,但class并不存在于所有的a标签中(自己的想法是写2个正则进行匹配(带class与否),最后将得到的数据汇总),mon里的数值也不一样,所以需要用正则匹配出来,到时候进行二次处理(若不需要的话),以下为代码(带class,同理不带class)

    import re
    import requests
    
    url = 'http://news.baidu.com/'
    headers = {
        "User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
    }
    
    # response.text 不太准确 转码 是靠推测
    data = requests.get(url, headers=headers).content.decode()
    
    # 正则解析 数据[u4e00-u9fa5]
    pattern = re.compile('<a href="(.*?)" target="_blank" class="a3" mon="(.*?)"(.*)</a>') 
    result = pattern.findall(data) 
    print(result)

    结果如下(截取部分图):

    二. xpath解析数据

     1. 安装支持并能解析html和XML的解析库 ------lxml:

    pip install lxml

     2. 转换数据的解析类型

    xpath_data = etree.HTML(data)
    

     3. xpath语法

    1. “/”  表示节点

    result = xpath_data.xpath('/html/head/title//text()')  # 按照节点顺序一级一级获取内容

    2. “//” 表示跨节点

    result = xpath_data.xpath('//a/text()')  # 跨节点获取内容
    

    3.精确的标签: //a[@属性="属性值"]   

    result = xpath_data.xpath('//a[@mon="ct=1&a=2&c=top&pn=18"]')  # 得到a标签对象
    result = xpath_data.xpath('//a[@mon="ct=1&a=2&c=top&pn=18"]/text()') # 获取内容

    4. 获取某个标签的url: @href

    result = xpath_data.xpath('//a[@mon="ct=1&a=2&c=top&pn=18"]/@href')
    

     代码

    import re
    import requests
    
    # 安装支持 解析html和XML的解析库 lxml
    # pip install lxml
    from lxml import etree
    
    url = 'http://news.baidu.com/'
    headers = {
        "User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
    }
    
    # response.text 不太准确 转码 是靠推测
    data = requests.get(url, headers=headers).content.decode()
    
    # 1.转解析类型
    xpath_data = etree.HTML(data)
    
    # 2调用 xpath的方法
    result = xpath_data.xpath('/html/head/title//text()')
    result = xpath_data.xpath('//a/text()')
    result = xpath_data.xpath('//a[@mon="ct=1&a=2&c=top&pn=18"]')
    result = xpath_data.xpath('//a[@mon="ct=1&a=2&c=top&pn=18"]/@href')
    result = xpath_data.xpath('//li/a/text()')
    
    print(result)
    
    with open('02news.html', 'w') as f:
      f.write(data)

    三 练习1  爬取btc论坛title以及相应的url

       这个论坛爬取不到信息(html源码),应该是做了反爬处理了,可能的原因:

    Ajax动态加载 

         ajax动态加载的工作原理是:从网页的url加载网页的源代码之后,会在浏览器里执行javaScript程序。这些程序会加载出更多的内容,并把这些内容传输到网页中。这就是为什么有些网页直接爬取它的URL时却没有数据的原因。

    解决方案:

         使用审查元素分析“请求”对应的连接(方法:审查元素--->Network---->清空,点击加载更多,出现对应的Get连接寻找Type为text/html的,点击,查看get参数或者复制Request URL),循环过程。如果请求之前有页面,依据上一步的网址进行分析推导第一页。以此类推,抓取Ajax地址的数据。对返回的json使用request中的json进行解析,使用eval()转成字典处理

       

  • 相关阅读:
    第八周读书笔记 ——编程之美
    结对编程收获——旧的不去&新的不来
    第七周读书笔记——深入理解计算机系统
    第六周读书笔记——《编程珠玑(第二版)》
    专业性体育平台——虎扑的发展与创新的思考(第五次课后作业)
    第五次读书笔记—— Robrt C. Martin的《代码整洁之道》
    个人博客-ASE课程最后一周总结
    期中作业,阅读材料感想
    Poemscape beta版本第二阶段目标描述
    Poemscape|Beta阶段第二天
  • 原文地址:https://www.cnblogs.com/jj1106/p/11223218.html
Copyright © 2011-2022 走看看