? ? ? 今天给新手带来了一些可以用来爬虫的几个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.ioloop
import tornado.web
import 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 asyncio
from 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.title
feed_description = feed.feed.description
print("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 aiohttp
import 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
#提供文章?URL
url = '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())