• python简单爬虫(一)


      学习python前纠结了下,到底是应该一个个知识点吃透,然后写些小程序。还是应该快速掌握基础语法,快速实践。思考后认为前者这么学习速度真心不高,于是花2天时间看了下python3的语法,虽然很多都不明白,但是带着小项目来学习直接解决问题。在项目中遇到问题,查阅一点点解决,这样很靠谱。

      在实现一个最简单的爬虫前,应该知道需要用到哪些东西? 

      1.如果发送一个http请求,来抓取网页内容。

      2.如何方便的解析html的dom节点,如果有像phpquery这样的工具包就太简单了。

      百度了下发现 urlib模块能解决第一个问题,BeautifulSoup模块能解决第二个问题

      urlib3模块简单使用  

     1 import urllib3
     2 
     3 #请求的地址
     4 url = 'https://www.baidu.com/'
     5 
     6 http = urllib3.PoolManager()
     7 r = http.request('GET',url)
     8 
     9 print(r.status)     #请求状态码
    10 print(r.data)       #获取内容

      需要注意的是打印出内容(r.data)发现尼玛, 总是有个 b' 这样的东西在字符串最前面。google下发先大致是说,python默认字符是ascii,但是请求的网页编码是utf8字符的,获取的内容需要转成

    utf8字符集然后在输出,可以这么干。

    print(r.data.decode('utf-8'))

      然后重新运行发现大功告成。

      再来看下BeautifulSoup模块,其实挺简单的就和jquery操作dom类似,具体看文档即可.

      

     1 from bs4 import BeautifulSoup
     2 import re #正则
     3 
     4 str = '''
     5       <div class="menu">
     6     <ul class="main-menu">
     7         <li class="first-menu"><a href="/index.php?m=Admin&c=Goods&a=index&typelist=1">品牌商管理</a></li>
     8         <li class="first-menu"><a href="javascript:;">商品管理</a></li>
     9         <li class="first-menu"><a href="/index.php?m=Admin&c=MyDistribution&a=index">分销平台</a></li>
    10         <li class="first-menu">
    11             <a href="javascript:;">消息中心</a>
    12             <ul class="sub-menu clearfix">
    13                 <li><a href="/index.php?m=Admin&c=News&a=businessNewsList">商家公告</a></li>
    14                 <li><a href="/index.php?m=Admin&c=Distribution&a=distributionList">申请分销</a></li>
    15                 <li><a href="/index.php?m=Admin&c=Message&a=chatMessageList">聊天消息</a></li>
    16                 <li><a href="/index.php?m=Admin&c=System&a=systemNewsList">系统公告</a></li>
    17             </ul>
    18         </li>
    19         <li class="first-menu"><a href="javascript:;">嗨库社区</a></li>
    20         <li class="first-menu"><a href="javascript:;">我的设置</a></li>
    21     </ul>
    22 </div>
    23 '''
    24 
    25 soup = BeautifulSoup(str,'html.parser',from_encoding='utf-8')
    26 
    27 print('获取所有的链接')
    28 links= soup.find_all('a'); #list
    29 for a in links:
    30     print(a),print(a['href']) #获取a标签,和属性href
    31 
    32 print('获取href为 /index.php?m=Admin&c=Goods&a=index&typelist=1的url')
    33 links = soup.find('a',href="/index.php?m=Admin&c=Goods&a=index&typelist=1")
    34 print(links.name,links['href'],links.get_text())
    35 
    36 
    37 print('通过class属性')
    38 links = soup.find('ul',class_='main-menu')
    39 print(links)
    40 
    41 print('正则匹配')
    42 links = soup.find_all('a',href=re.compile(r"List")) # 加r -> 要转义只需要写成 \即可 , 不然要写成\
    43 print(links)

      最后结合2个模块来实现,获取抓取页面的 a标签的href

     1 from bs4 import BeautifulSoup
     2 import re #正则
     3 import urllib.parse
     4 import urllib3
     5 
     6 r_url = 'http://baike.baidu.com/link?url=41wW1kkRvhT23i_c6258EtBeBv6Xwtz7gwd3t0q5k-xCs_ipCGRc_ixcCLMail3QtQe4ZRgOK83ek9aHm44QPa'
     7 
     8 #发送请求获取内容
     9 http = urllib3.PoolManager()
    10 r = http.request('GET',r_url)
    11 
    12 str = data = r.data.decode('utf-8')
    13 
    14 '''
    15 #挽尊学习法,先发获取的内容生成文件,看下到底是什么
    16 f = open('2.html','w')
    17 f.write(data.decode('utf-8'))
    18 f.close()
    19 '''
    20 
    21 soup = BeautifulSoup(str,'html.parser',from_encoding='utf-8')
    22 #通过正则获取所有href 为  /view/123/456.htm 这样的链接
    23 links = soup.find_all('a',href=re.compile(r'/view/[d/]+.htm'))  # 加r -> 只需要一个 转义 , 不然要写成\
    24 
    25 for url in links:
    26     new_url = url['href']
    27     '''
    28     将 r_url的域名-> http://baike.baidu.com
    29     和 新的url ->  /view/123/456.htm 组装起来
    30     '''
    31     new_full_url = urllib.parse.urljoin(r_url,new_url) #http://baike.baidu.com/view/123/456.htm
    32     print(new_full_url)

      参考:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/

         http://urllib3.readthedocs.io/en/latest/ 

          

  • 相关阅读:
    从实战角度超级详解中大型企业微服务化的六大核心关键技术
    Web API 入门的相关文章
    发布asp.net core3.1 web api to IIS
    web api 起步之一
    工作中常见的一些英语
    SSIS--Excel Demo
    SSIS中常用的一些Task组件
    企业系统上Azure的建议与注意事项
    POST提交时防止密码泄漏
    转 Netbackup用于技术支持的问题报告(报障模版)
  • 原文地址:https://www.cnblogs.com/loveyouyou616/p/5576594.html
Copyright © 2020-2023  润新知