• python常见爬虫库以及案例


    python常见爬虫库以及案例

    一、常见库

    以下是一些常见的Python爬虫库,按照一般热门程度的排序:

    1. Requestsrequests库是非常流行的用于发送HTTP请求的库,因其简洁易用和广泛的社区支持而备受青睐。
    2. Beautiful Soup:Beautiful Soup是一个广泛使用的HTML和XML解析库,用于提取和操作网页内容。
    3. Scrapy:Scrapy是一个功能强大的爬虫框架,广泛用于大规模爬取任务。它有一个活跃的社区和强大的文档支持。
    4. Selenium:Selenium用于浏览器自动化和处理JavaScript内容,特别适用于需要模拟用户行为的任务。
    5. lxml:lxml是一个高性能的HTML和XML解析库,它支持XPath,可用于高效地处理大量数据。
    6. Splash:Splash是一个用于处理JavaScript渲染的服务,对于需要动态网页抓取的任务非常有用。
    7. PyQuery:PyQuery提供了类似于jQuery的语法,用于HTML解析和操作。
    8. Tornado:Tornado是一个异步网络库,适用于构建高性能的网络爬虫,虽然不仅仅用于爬虫。
    9. Gevent:Gevent是一个协程库,用于编写异步和高性能的网络应用,也可用于爬虫。
    10. Aiohttp:Aiohttp是一个用于构建异步HTTP客户端/服务器的框架,适用于异步爬虫。

    二、案例

    以下是一些简单的Python爬虫库的示例用例:

    1. Requests

      import requests
      
      # 发送GET请求
      response = requests.get("https://www.example.com")
      print(response.text)
      
      • 1
      • 2
      • 3
      • 4
      • 5
    2. Beautiful Soup

      from bs4 import BeautifulSoup
      import requests
      
      # 发送GET请求并解析HTML
      response = requests.get("https://www.example.com")
      soup = BeautifulSoup(response.text, 'html.parser')
      
      # 提取标题文本
      title = soup.title.string
      print("Title:", title)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
    3. Scrapy

      使用Scrapy来爬取整个网站的所有标题链接:

      scrapy startproject myproject
      
      • 1

      创建一个Spider并定义抓取规则:

      import scrapy
      
      class MySpider(scrapy.Spider):
          name = "example"
          start_urls = [
              "https://www.example.com",
          ]
      
          def parse(self, response):
              for title in response.css('h1'):
                  yield {
                      'title': title.get(),
                  }
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13

      运行Spider:

      scrapy crawl example
      
      • 1
    4. Selenium

      使用Selenium来打开一个网页并截取屏幕截图:

      from selenium import webdriver
      
      # 启动Chrome浏览器
      driver = webdriver.Chrome()
      
      # 打开网页
      driver.get("https://www.example.com")
      
      # 截取屏幕截图
      driver.save_screenshot("screenshot.png")
      
      # 关闭浏览器
      driver.quit()
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
    5. lxml

      使用lxml来解析HTML并提取链接:

      from lxml import html
      import requests
      
      # 发送GET请求
      response = requests.get("https://www.example.com")
      
      # 解析HTML
      tree = html.fromstring(response.content)
      
      # 提取所有链接
      links = tree.xpath('//a/@href')
      for link in links:
          print("Link:", link)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
    6. PyQuery

      使用PyQuery来解析HTML并提取标题:

      from pyquery import PyQuery as pq
      import requests
      
      # 发送GET请求
      response = requests.get("https://www.example.com")
      
      # 创建PyQuery对象
      doc = pq(response.text)
      
      # 提取标题文本
      title = doc('title').text()
      print("Title:", title)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
    7. Splash

      使用Splash来渲染JavaScript并获取渲染后的页面内容:

      import requests
      import json
      
      # 请求Splash服务来渲染页面
      url = "http://localhost:8050/render.html"
      params = {
          'url': "https://www.example.com",
          'wait': 2  # 等待2秒钟,以确保JavaScript加载完成
      }
      response = requests.get(url, params=params)
      
      # 解析渲染后的页面内容
      rendered_html = response.text
      print(rendered_html)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
    8. Tornado

      使用Tornado构建一个简单的异步爬虫:

      import tornado.ioloop
      import tornado.httpclient
      
      async def fetch_url(url):
          http_client = tornado.httpclient.AsyncHTTPClient()
          response = await http_client.fetch(url)
          print("Fetched URL:", url)
          return response.body
      
      async def main():
          urls = ["https://www.example.com", "https://www.example2.com"]
          for url in urls:
              html = await fetch_url(url)
              # 在这里处理HTML内容
      
      if __name__ == "__main__":
          tornado.ioloop.IOLoop.current().run_sync(main)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
    9. Gevent

      使用Gevent来并发地获取多个URL:

      import gevent
      import requests
      
      def fetch_url(url):
          response = requests.get(url)
          print("Fetched URL:", url)
          # 在这里处理HTML内容
      
      urls = ["https://www.example.com", "https://www.example2.com"]
      jobs = [gevent.spawn(fetch_url, url) for url in urls]
      gevent.joinall(jobs)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    10. Aiohttp

      使用Aiohttp来异步获取多个URL:

      import aiohttp
      import asyncio
      
      async def fetch_url(url):
          async with aiohttp.ClientSession() as session:
              async with session.get(url) as response:
                  html = await response.text()
                  print("Fetched URL:", url)
                  # 在这里处理HTML内容
      
      urls = ["https://www.example.com", "https://www.example2.com"]
      loop = asyncio.get_event_loop()
      tasks = [fetch_url(url) for url in urls]
      loop.run_until_complete(asyncio.gather(*tasks))
      loop.close()
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
  • 相关阅读:
    JavaWeb--06Vue组件库Element
    数据结构 - 线段树的运用
    特斯拉为何使用.NET Core技术框架?
    scipy.io.matlab._streams.GenericStream.read_into OSError: could not read bytes
    60行PHP代码实现值班信息查询带万年历
    个人职业规划
    【已解决】由于此设备上的安全设置已更改,你的pin不再可用,单击以重新设置Pin
    Hadoop源码阅读(三):HDFS上传
    Java基于springboot+vue的流浪动物救助收养平台 nodejs 前后端分离
    CentOS常用基础命令汇总
  • 原文地址:https://blog.csdn.net/weixin_52236586/article/details/134090554