爬虫:一个简单实例说明爬虫机制

原文地址

爬虫,我的简单理解就是通过写定的程序,利用计算机的高速的优势,批量高效的获取数据的一种机制。通常我们访问网站是通过浏览器,而爬虫就是通过程序访问网站,也就是让程序伪装成浏览器进行访问。

  • Request

    伪装浏览器发送请求

    应用实例

    import requests
    
    res = requests.get(
        url='https://blog.csdn.net/BBJG_001',   # 我的CSDN个人主页
    )
    
    print(res.url)
    # https://blog.csdn.net/BBJG_001
    print(res.text)     # 查看整个网页(html的形式),就是在浏览器中查看网页源代码所看到的的内容
    # 这里只截取开始几行来显示
    # <!DOCTYPE html>
    # <html lang="zh-CN">
    # <head>
    #     <meta charset="UTF-8">
    #     <link rel="canonical" href="https://blog.csdn.net/BBJG_001"/>
    
  • BeautifulSoup

    是一个用来解析html页面的模块,可以接收一个html或xml的字符串,通过其中封装的方法可以很方便的根据标签以及标签的属性获得html页面中的标签所含的内容。

    在此之前,爬取的页面的解析往往是通过正则表达式来完成的,而正则表达式的使用不是那么容易的

    这里以我的CSDN个人主页为例来说明BeautifulSoup模块的使用

    • 导入支持包

      import requests
      from bs4 import BeautifulSoup  # 解析html网页的
      
    • 获取网页

      res = requests.get(
          url='https://blog.csdn.net/BBJG_001',  # 我的CSDN个人主页
      )
      
    • 用获取的网页封装BeautifulSoup对象

      soup = BeautifulSoup(res.text, 'html.parser')
      
    • 在浏览器中访问上面的网页,按F12查看源码

      1582982007236

      看到目录主体都在class=‘article-list’的div下

      展开一个文章项目

      1582982249294

      其中一个h4标签中封装这标题一行,包含着指向文章详细内容的链接

    • 根据上面的结构从BeautifulSoup中获取内容

      div = soup.find(name='div', attrs={'class': 'article-list'})
      # find:找到阈值相匹配的第一个标签
      # 通过class进行find的时候,要格外注意一下,因为不同的标签的class值可能是相同,
      # 这里我通过查看源码确认了该class值只在这个div才有
      # 通过id寻找是一种比较准确的方式,因为通过id匹配是唯一的
      # 在class相同的情况下,可以通过多指定几个属性的方式增加定位的精确度
      
      h4_list = div.find_all(name='h4')
      # find_all:找对与之相匹配的所有标签
      a_list = [h4.find(name='a') for h4 in h4_list]  # 从h4列表中提取出a标签
      
      data = {}
      
      for a in a_list:
          link = a.attrs.get('href')  # 获取标签的某个属性
          content = a.text			# 获取标签中间的内容
          print(link)
      # 只给出部分做显示
      # https://blog.csdn.net/BBJG_001/article/details/104587102
      # https://blog.csdn.net/BBJG_001/article/details/104587067
      # https://blog.csdn.net/BBJG_001/article/details/104587033
      
    • 获取图片举例

      注意这里跟上面没有什么关系,只是为了介绍这个功能而做的测试

      r2 = requests.get('https://imgconvert.csdnimg.cn/aHR0cHM6Ly96eWRzdG9yZS0xMjU4NDc3NzE0LmNvcy5hcC1iZWlqaW5nLm15cWNsb3VkLmNvbS90eXBvcmEvMjAyMDAyMjMxNTE2MDctMTE5ODQ0LnBuZw?x-oss-process=image/format,png')
      savepath = r'data/pictures/test01.png'
      with open(savepath, 'wb') as f:  # 因为下载的是图片,所以是wb,以二进制流写入
          f.write(r2.content)
          # ret.text 将结果ret转换成字符串,ret.content直接是二进制文件
      

      实际应用中可以find到网页中获得的img标签中的src属性,根据src获取文件,并进行保存,注意保存图片时文件打开方式为wb,f.write()中的传参为二进制形式

  • 防爬虫机制

    要说明的是,不是所有的网站内容都是可以爬取,或者说不是那么容易爬取的

    浏览器在发送请求时,除了会携带一些服务器所需的认证信息(用户名/密码/token等),还会携带一些浏览器本身的信息,比较简单的防爬虫机制就是去检测发送的信息中的这些浏览器信息,如果信息不完善或不匹配,访问目标可能会驳回通过代码发送的访问请求

    通过在代码中追加浏览器信息可以骗过防爬虫措施不到位的网站

相关文献
在Python应用正则表达式

发布了147 篇原创文章 · 获赞 142 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/BBJG_001/article/details/104625447
今日推荐