今天给新手带来了一些可以用来爬虫的几个Python库。只要正确选择适合自己的Python库才能真正提高爬虫效率,到达高效爬虫目的。

1.PyQuery

from pyquery import PyQuery as pq#网址url = f'https://www.baidu.com/'doc = pq(url=url)#输出HTML内容print(doc.html())
优点:基于jQuery语法,易于使用,可以方便地解析和操作HTML/XML文档。缺点:对于复杂的DOM结构可能支持不完善。

2.requests

import requests#发送 GET 请求response = requests.get('https://www.baidu.com')
#输出响应内容print(response.text)
优点:简单易用,提供了丰富的HTTP方法和功能,支持会话管理和Cookie处理。缺点:同步阻塞,不能处理JavaScript渲染。

3.Scrapy

import scrapy    # 定义一个名为MySpider的爬虫类,继承自scrapy.Spider类  class MySpider(scrapy.Spider):      # 设置爬虫的名称      name = 'myspider'      # 设置爬虫开始抓取的URL列表      start_urls = ['https://www.example.com']      # 定义parse方法,该方法是Scrapy用来处理每个下载的响应的地方      def parse(self, response):          # 提取页面上的所有链接          links = response.css('a::attr(href)').getall()          # 遍历链接列表,并对每个链接进行处理          for link in links:              # 打印链接              print(link)              # 使用yield语句返回一个字典,包含从响应中提取的链接              yield {'link': link}
优点:高度可定制,支持分布式爬取,自带的中间件和管道可以方便地扩展功能。缺点:配置和部署相对复杂。

4.Selenium

from selenium import webdriver    #创建一个Chrome浏览器实例  driver = webdriver.Chrome()  #打开一个网页  driver.get("https://www.example.com")  #获取网页标题并打印出来  print(driver.title)  #关闭浏览器实例  driver.quit()
优点:可以模拟浏览器行为,支持JavaScript渲染,解决动态网页爬取问题。缺点:相对较慢,占用资源较多。

5.Urllib

import urllib.request  #打开指定的URL并获取网页内容  url = 'https://www.example.com'  response = urllib.request.urlopen(url)  #读取网页内容并打印  html_content = response.read()  print(html_content)
优点:Python标准库,无需额外安装,功能齐全。缺点:相对低级,使用起来较繁琐。

6.Tornado

import tornado.ioloopimport tornado.webimport tornado.httpclient
class MainHandler(tornado.web.RequestHandler):    async def get(self):        #创建异步HTTP客户端对象        http_client = tornado.httpclient.AsyncHTTPClient()        #发送异步GET请求到Bing首页        response = await http_client.fetch("https://www.bing.com")        #获取页面内容并提取标题        title = response.body.decode('utf-8')        start = title.find("<title>") + len("<title>")        end = title.find("</title>", start)        title = title[start:end]        #返回页面标题给客户端        self.write("Bing Title: {}".format(title))
def make_app():    #创建Tornado应用程序对象    return tornado.web.Application([        (r"/", MainHandler),    ])
if __name__ == "__main__":    app = make_app()    #监听8888端口    app.listen(8888)    #启动Tornado事件循环    tornado.ioloop.IOLoop.current().start()
优点:高性能异步框架,支持大规模并发,适合构建高性能Web应用程序。缺点:相对复杂

7.Pyppeteer

import asynciofrom pyppeteer import launch
async def main():    browser = await launch(headless=False)    page = await browser.newPage()    await page.goto('https://www.google.com')    await page.type('input[name="q"]', 'Pyppeteer')    await page.click('input[type="submit"]')    await page.waitForNavigation()    print(await page.title())    await browser.close()
asyncio.get_event_loop().run_until_complete(main())
优点:基于Chrome DevTools Protocol,可以完全控制Headless Chrome浏览器,支持JavaScript渲染。缺点:相对较新,社区支持可能不如Selenium成熟。

8.feedparser

import feedparser
#解析订阅源url = 'https://rss.slashdot.org/Slashdot/slashdotMain'feed = feedparser.parse(url)
#获取订阅源的元数据feed_title = feed.feed.titlefeed_description = feed.feed.descriptionprint("Feed Title:", feed_title)print("Feed Description:", feed_description)
#遍历订阅项for entry in feed.entries:    entry_title = entry.title    entry_link = entry.link    if 'published' in entry:        entry_published = entry.published    else:        entry_published = "Unknown"    print("\nEntry Title:", entry_title)    print("Entry Link:", entry_link)    print("Published:", entry_published)
优点:简单易用,支持解析各种格式的RSS和Atom订阅源。缺点:功能相对有限,不适合处理复杂的页面结构。

9.playwright

from playwright.sync_api import Playwright, sync_playwright
with sync_playwright() as p:    # 选择浏览器引擎和选项    browser = p.chromium.launch(headless=False)    context = browser.new_context()    page = context.new_page()
    # 打开百度网站    page.goto('https://www.baidu.com')
    # 在搜索框中输入关键字并提交搜索    search_input = page.locator('#kw')    search_input.fill('Python')    search_button = page.locator('#su')    search_button.click()
    # 等待搜索结果加载完毕并截图    page.wait_for_selector('#content_left')    page.screenshot(path='baidu_search.png')
    # 关闭浏览器    context.close()    browser.close()
优点:支持多种浏览器(包括Chrome、Firefox、WebKit),提供了简洁易用的API,支持跨平台。缺点:相对较新,社区支持可能不如Selenium成熟。

10.mechanicalsoup

import mechanicalsoup
#创建一个 Browser 对象browser = mechanicalsoup.StatefulBrowser()
#发起 GET 请求并打开百度首页browser.open("https://www.baidu.com")
#输出当前页面的标题print(browser.get_current_page().title)
#选择搜索框元素并填入关键字browser.select_form()browser["wd"] = "Python"
#提交搜索表单browser.submit_selected()
#输出搜索结果页面的标题print(browser.get_current_page().title)
优点:简化了与网站交互的过程,使用起来类似于requests和BeautifulSoup的结合体。缺点:功能相对较少,不支持JavaScript渲染。

11.Aiohttp

import aiohttpimport asyncio
async def fetch_url(url):    async with aiohttp.ClientSession() as session:        async with session.get(url) as response:            return await response.text()
async def main():    url = 'https://example.com'    html = await fetch_url(url)    print(html)
if __name__ == '__main__':    loop = asyncio.get_event_loop()    loop.run_until_complete(main())
优点:基于异步IO的高性能HTTP客户端/服务器框架,适用于构建异步Web应用程序。缺点:相对复杂

12.newspaper3k

from newspaper import Article
#提供文章 URLurl = 'https://news.sina.com.cn/c/2021-06-01/123456789.html'
#初始化 Article 对象,并设置语言为中文article = Article(url, language='zh')
#下载文章内容article.download()
#解析文章article.parse()
#打印文章标题print("文章标题:", article.title)
#打印文章作者print("文章作者:", article.authors)
#打印文章发布日期print("发布日期:", article.publish_date)
#打印文章正文print("文章正文:", article.text)
#提取文章关键词article.nlp()print("关键词:", article.keywords)
#生成文章摘要print("文章摘要:", article.summary)
优点:易于使用,提供了从新闻网站抽取文章的功能,支持多种语言。缺点:不适合处理非新闻网站的页面。

14.Frontera

from frontera.core import FrontierManager  from frontera.core import Strategy  from frontera.logger.frontier import FrontierLogger  from frontera.settings import Settings  from frontera.utils.downloader import Downloader    # 创建FrontierManager对象  frontier_manager = FrontierManager(seed_urls=['http://example.com'])    # 设置策略类和下载器类  settings = Settings()  settings.set(param='STRATEGY', value=Strategy)  settings.set(param='DOWNLOADER', value=Downloader)    # 创建FrontierLogger对象,用于记录爬虫日志  frontier_logger = FrontierLogger('frontera.log')    # 运行爬虫  frontier_manager.run(settings, frontier_logger)
优点:分布式爬虫框架,支持动态网页爬取和抓取策略的自定义。缺点:配置和部署相对复杂

15.grab

import grab  
# 创建 Grab 对象  g = grab.Grab()    # 设置要抓取的 URL  url = "http://example.com"    # 获取页面内容  g.go(url)    # 获取页面标题  title = g.doc.title()  print("Title:", title)    # 获取页面上的所有段落文本  paragraphs = g.doc.find_all("p")  for p in paragraphs:      print("Paragraph:", p.text())
12-21 09:35