• 00. 这里整理了最全的爬虫框架(Java + Python)


    目录

    1、前言

    2、什么是网络爬虫

    3、常见的爬虫框架

    3.1、java框架

    3.1.1、WebMagic

    3.1.2、Jsoup

    3.1.3、HttpClient

    3.1.4、Crawler4j

    3.1.5、HtmlUnit

    3.1.6、Selenium

    3.2、Python框架

    3.2.1、Scrapy

    3.2.2、BeautifulSoup + Requests

    3.2.3、Selenium

    3.2.4、PyQuery

    3.2.5、PySpider

    3.2.6、Portia

    3.2.7、Newspaper

    3.2.8、Crawley

    3.2.9、Grab

    3.2.10、Python-goose

    3.2.11、Cola

    4、爬虫策略


    1、前言

    网络爬虫技术在信息时代的大数据时代中变得越来越重要。它是一种从互联网上获取数据的技术,被广泛应用于搜索引擎、数据挖掘、商业情报等领域。

    2、什么是网络爬虫

    网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。通常网络爬虫是一种自动化程序或脚本,专门用于在互联网上浏览和抓取网页信息。网络爬虫的主要目的是从网络上的不同网站、页面或资源中搜集数据。它是搜索引擎、数据挖掘、内容聚合和其他信息检索任务的关键组成部分。

    网络爬虫的工作方式类似于人类在互联网上浏览网页的过程,但是它能够以更快的速度、更大的规模和更一致的方式执行这些任务。网络爬虫的基本流程包括:

    1. 发送请求:爬虫向目标网站发送HTTP请求,请求特定的网页或资源。
    2. 获取网页内容:爬虫接收到服务器的响应,获取网页的HTML或其他相关内容。
    3. 解析网页:爬虫使用解析器(如HTML解析器)分析网页的结构,提取需要的信息。
    4. 存储数据: 爬虫将提取的数据存储到本地数据库、文件或其他存储介质中。
    5. 遍历链接:爬虫可能会继续遍历网页中的链接,递归抓取更多的页面。

    虽然网络爬虫在信息检索和数据分析中具有重要作用,但需要注意合法使用,遵循网站的爬取规则,以及尊重隐私和版权等法律和伦理规定。

    3、常见的爬虫框架

    爬虫框架是一种用于开发网络爬虫(Web Crawler)的工具或软件框架。网络爬虫是一类程序,用于自动地浏览互联网,并收集、提取感兴趣的信息。爬虫框架提供了一系列的工具和功能,简化了爬虫的开发过程,加速了数据采集的效率。这里汇总了一些常见的Java类爬虫框架和Python类爬虫框架。

    3.1、java框架

    3.1.1、WebMagic

    WebMagic是一款基于Java的开源爬虫框架,支持注解和设计模式,简化了爬取任务的实现。官网地址:Introduction · WebMagic Documents

    WebMagic的总体架构:

    以下是一个简单的WebMagic示例:

    1. import us.codecraft.webmagic.Page;
    2. import us.codecraft.webmagic.Site;
    3. import us.codecraft.webmagic.Spider;
    4. import us.codecraft.webmagic.processor.PageProcessor;
    5. public class MySpider implements PageProcessor {
    6. private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);
    7. @Override
    8. public void process(Page page) {
    9. // 爬虫逻辑,提取页面内容等
    10. }
    11. @Override
    12. public Site getSite() {
    13. return site;
    14. }
    15. public static void main(String[] args) {
    16. Spider.create(new MySpider())
    17. .addUrl("http://www.example.com")
    18. .run();
    19. }
    20. }

    3.1.2、Jsoup

    Jsoup是一款用于解析HTML文档的Java库,提供了类似于jQuery的API。官网地址:jsoup: Java HTML parser, built for HTML editing, cleaning, scraping, and XSS safety

    简单示例代码:

    1. import org.jsoup.Jsoup;
    2. import org.jsoup.nodes.Document;
    3. import org.jsoup.nodes.Element;
    4. import org.jsoup.select.Elements;
    5. import java.io.IOException;
    6. public class JsoupExample {
    7. public static void main(String[] args) {
    8. String url = "http://www.example.com";
    9. try {
    10. Document document = Jsoup.connect(url).get();
    11. // 爬虫逻辑,提取页面内容等
    12. } catch (IOException e) {
    13. e.printStackTrace();
    14. }
    15. }
    16. }

    3.1.3、HttpClient

    Apache HttpClient 是一个用于发送 HTTP 请求的 Java 库,可以用于编写简单的网络爬虫。以下是一个使用 HttpClient 实现的简单爬虫示例代码。官网地址:Overview (Apache HttpClient 5.2.3 API)

    简单示例代码:

    1. import org.apache.http.HttpEntity;
    2. import org.apache.http.HttpResponse;
    3. import org.apache.http.client.HttpClient;
    4. import org.apache.http.client.methods.HttpGet;
    5. import org.apache.http.impl.client.HttpClients;
    6. import org.apache.http.util.EntityUtils;
    7. import java.io.IOException;
    8. public class SimpleHttpClientCrawler {
    9. public static void main(String[] args) {
    10. // 创建 HttpClient 实例
    11. HttpClient httpClient = HttpClients.createDefault();
    12. // 指定要爬取的 URL
    13. String url = "http://www.example.com";
    14. // 创建 HTTP GET 请求
    15. HttpGet httpGet = new HttpGet(url);
    16. try {
    17. // 执行请求并获取响应
    18. HttpResponse response = httpClient.execute(httpGet);
    19. // 获取响应实体
    20. HttpEntity entity = response.getEntity();
    21. if (entity != null) {
    22. // 将响应实体转换为字符串
    23. String content = EntityUtils.toString(entity);
    24. System.out.println(content);
    25. }
    26. } catch (IOException e) {
    27. e.printStackTrace();
    28. } finally {
    29. // 关闭 HttpClient 连接
    30. try {
    31. httpClient.close();
    32. } catch (IOException e) {
    33. e.printStackTrace();
    34. }
    35. }
    36. }
    37. }

    3.1.4、Crawler4j

    Crawler4j是一个开源的Java类库提供一个用于抓取Web页面的简单接口。可以利用它来构建一个多线程的Web爬虫。官网地址:GitHub - yasserg/crawler4j: Open Source Web Crawler for Java

    以下是简单示例代码:

    1. public class Controller {
    2. public static void main(String[] args) throws Exception {
    3. String crawlStorageFolder = "/data/crawl/root";
    4. int numberOfCrawlers = 7;
    5. CrawlConfig config = new CrawlConfig();
    6. config.setCrawlStorageFolder(crawlStorageFolder);
    7. // Instantiate the controller for this crawl.
    8. PageFetcher pageFetcher = new PageFetcher(config);
    9. RobotstxtConfig robotstxtConfig = new RobotstxtConfig();
    10. RobotstxtServer robotstxtServer = new RobotstxtServer(robotstxtConfig, pageFetcher);
    11. CrawlController controller = new CrawlController(config, pageFetcher, robotstxtServer);
    12. // For each crawl, you need to add some seed urls. These are the first
    13. // URLs that are fetched and then the crawler starts following links
    14. // which are found in these pages
    15. controller.addSeed("https://www.ics.uci.edu/~lopes/");
    16. controller.addSeed("https://www.ics.uci.edu/~welling/");
    17. controller.addSeed("https://www.ics.uci.edu/");
    18. // The factory which creates instances of crawlers.
    19. CrawlController.WebCrawlerFactory factory = MyCrawler::new;
    20. // Start the crawl. This is a blocking operation, meaning that your code
    21. // will reach the line after this only when crawling is finished.
    22. controller.start(factory, numberOfCrawlers);
    23. }
    24. }

    3.1.5、HtmlUnit

    HtmlUnit 是一个用于模拟浏览器行为的 Java 库,可用于爬取动态网页。它对 HTML 文档进行建模并提供一个 API,允许您调用页面、填写表单、单击链接等......就像您在“普通”浏览器中所做的那样。它具有相当好的 JavaScript 支持(正在不断改进),甚至能够使用相当复杂的 AJAX 库,根据所使用的配置模拟 Chrome、Firefox 或 Internet Explorer。官网地址:HtmlUnit – Welcome to HtmlUnit

    简单示例代码:

    1. import com.gargoylesoftware.htmlunit.BrowserVersion;
    2. import com.gargoylesoftware.htmlunit.WebClient;
    3. import com.gargoylesoftware.htmlunit.html.HtmlPage;
    4. public class HtmlUnitExample {
    5. public static void main(String[] args) {
    6. try (WebClient webClient = new WebClient(BrowserVersion.CHROME)) {
    7. // 打开一个包含 JavaScript 渲染的页面
    8. HtmlPage page = webClient.getPage("http://www.example.com");
    9. // 获取页面标题
    10. String title = page.getTitleText();
    11. System.out.println("Page Title: " + title);
    12. } catch (Exception e) {
    13. e.printStackTrace();
    14. }
    15. }
    16. }

    3.1.6、Selenium

    Selenium是一个用于Web

    应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成.Net、Java、Perl等不同语言的测试脚本。

    同样也可以用于爬取动态网页。官网地址:Selenium

    简单示例代码:

    1. import org.openqa.selenium.WebDriver;
    2. import org.openqa.selenium.chrome.ChromeDriver;
    3. public class SeleniumExample {
    4. public static void main(String[] args) {
    5. // 设置 ChromeDriver 路径
    6. System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver");
    7. // 创建 ChromeDriver 实例
    8. WebDriver driver = new ChromeDriver();
    9. try {
    10. // 打开一个包含 JavaScript 渲染的页面
    11. driver.get("http://www.example.com");
    12. // 获取页面标题
    13. String title = driver.getTitle();
    14. System.out.println("Page Title: " + title);
    15. } finally {
    16. // 关闭浏览器窗口
    17. driver.quit();
    18. }
    19. }
    20. }

    3.2、Python框架

    3.2.1、Scrapy

    Scrapy是一个功能强大且灵活的开源爬虫框架,用于快速开发爬虫和数据提取工具。它提供了基于规则的爬取方式,支持分布式爬取,并且有着良好的文档和活跃的社区。官网地址:GitHub - scrapy/scrapy: Scrapy, a fast high-level web crawling & scraping framework for Python.

    简单示例代码:

    1. import scrapy
    2. class MySpider(scrapy.Spider):
    3. name = 'myspider'
    4. start_urls = ['http://www.example.com']
    5. def parse(self, response):
    6. # 爬虫逻辑,提取页面内容等
    7. pass

    3.2.2、BeautifulSoup + Requests

    BeautifulSoup是一个HTML解析库,而Requests是一个用于发送HTTP请求的库。它们经常一起使用,可以轻松地进行网页解析和数据提取。官网地址:Beautiful Soup 4.12.0 文档 — Beautiful Soup 4.12.0 documentation

    简单示例代码:

    1. import requests
    2. from bs4 import BeautifulSoup
    3. url = 'http://www.example.com'
    4. response = requests.get(url)
    5. if response.status_code == 200:
    6. soup = BeautifulSoup(response.text, 'html.parser')
    7. # 爬虫逻辑,提取页面内容等
    8. else:
    9. print(f"请求失败,状态码:{response.status_code}")

    3.2.3、Selenium

    同Java下的Selenium一样,Python也同样支持该库。是一个用于自动化浏览器的工具,可以用于爬取动态网页,支持JavaScript渲染。它模拟用户在浏览器中的操作,适用于一些需要模拟用户行为的场景。

    简单示例代码:

    1. from selenium import webdriver
    2. url = 'http://www.example.com'
    3. driver = webdriver.Chrome()
    4. driver.get(url)
    5. # 爬虫逻辑,提取页面内容等
    6. driver.quit()

    3.2.4、PyQuery

    PyQuery是一个类似于jQuery的库,用于解析HTML文档。它提供了简洁的API,使得在Python中进行HTML解析变得更加方便。官网地址:pyquery · PyPI

    简单示例代码:

    1. from pyquery import PyQuery as pq
    2. url = 'http://www.example.com'
    3. doc = pq(url)
    4. # 爬虫逻辑,提取页面内容等

    3.2.5、PySpider

    PySpider 是一个强大的分布式爬虫框架,使用 Python 语言开发,专注于提供简单、灵活、强大、快速的爬虫服务。PySpider 支持分布式部署,具有良好的可扩展性和高度定制化的特点。官网地址:Introduction - pyspider

    简单示例代码:

    1. from pyspider.libs.base_handler import *
    2. class Handler(BaseHandler):
    3. crawl_config = {
    4. 'headers': {
    5. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    6. }
    7. }
    8. @every(minutes=24 * 60)
    9. def on_start(self):
    10. self.crawl('https://movie.douban.com/top250', callback=self.index_page)
    11. @config(age=10 * 24 * 60 * 60)
    12. def index_page(self, response):
    13. for each in response.doc('div.item'):
    14. self.crawl(each('div.hd a').attr.href, callback=self.detail_page)
    15. next = response.doc('.next a').attr.href
    16. self.crawl(next, callback=self.index_page)
    17. @config(priority=2)
    18. def detail_page(self, response):
    19. return {
    20. "url": response.url,
    21. "title": response.doc('h1 span').text(),
    22. "rating": response.doc('strong.ll.rating_num').text(),
    23. "cover": response.doc('img[rel="v:image"]').attr.src,
    24. }

    3.2.6、Portia

    Portia 是一个开源的可视化爬虫工具,用于从网站上提取结构化数据。它是 Scrapinghub 公司开发的一部分,旨在简化和加速网页数据抽取的过程,无需编写复杂的代码。官网地址:Getting Started — Portia 2.0.8 documentation

    Python中安装Portia:

    1. pip install portia
    2. # 安装后直接启动
    3. portia

    它将在本地启动一个 Web 服务,并提供一个 web 页面来进行数据抽取的可视化操作。

    3.2.7、Newspaper

    Newspaper 是一个用于提取文章内容的 Python 库。它旨在帮助开发者从新闻网站和其他在线文章中提取有用的信息,例如标题、作者、正文内容等。Newspaper 的设计目标是易于使用且高效,适用于各种新闻网站和文章结构。官网地址:GitHub - codelucas/newspaper: newspaper3k is a news, full-text, and article metadata extraction in Python 3. Advanced docs:

    安装newspaper3k

    pip install newspaper3k

    简单代码示例:

    1. from newspaper import Article
    2. # 输入文章的 URL
    3. article_url = 'https://www.example.com/article'
    4. # 创建 Article 对象并下载文章内容
    5. article = Article(article_url)
    6. article.download()
    7. # 解析文章内容
    8. article.parse()
    9. # 输出文章信息
    10. print("Title:", article.title)
    11. print("Authors:", article.authors)
    12. print("Publish Date:", article.publish_date)
    13. print("\nArticle Content:\n", article.text)

    3.2.8、Crawley

    Crawley可以高速爬取对应网站的内容,支持关系和非关系数据库,数据可以导出为JSON、XML等。Crawley 提供了非常强大和灵活的内容提取功能。它支持使用 CSS 选择器和 XPath 表达式从网页中提取所需的信息,使用 PyQuery 和 lxml 库进行解析。官网地址:Crawley’s Documentation — crawley v0.1.0 documentation

    简单示例代码:

    1. from crawley.crawlers import BaseCrawler
    2. from crawley.scrapers import BaseScraper
    3. from crawley.extractors import XPathExtractor
    4. from models import *
    5. class pypiScraper(BaseScraper):
    6. #specify the urls that can be scraped by this class
    7. matching_urls = ["%"]
    8. def scrape(self, response):
    9. #getting the html table
    10. table = response.html.xpath("/html/body/div[5]/div/div/div[3]/table")[0]
    11. #for rows 1 to n-1
    12. for tr in table[1:-1]:
    13. #obtaining the searched html inside the rows
    14. td_updated = tr[0]
    15. td_package = tr[1]
    16. package_link = td_package[0]
    17. td_description = tr[2]
    18. #storing data in Packages table
    19. Package(updated=td_updated.text, package=package_link.text, description=td_description.text)
    20. class pypiCrawler(BaseCrawler):
    21. #add your starting urls here
    22. start_urls = ["http://pypi.python.org/pypi"]
    23. #add your scraper classes here
    24. scrapers = [pypiScraper]
    25. #specify you maximum crawling depth level
    26. max_depth = 0
    27. #select your favourite HTML parsing tool
    28. extractor = XPathExtractor

    3.2.9、Grab

    Grab 是一个用于编写网络爬虫的 Python 框架。它提供了一套强大而灵活的工具,使得爬取和处理网页变得更加容易。Grab 的设计目标是简化常见的爬虫任务,同时保持足够的灵活性来处理各种不同的网站结构。官网地址:http://docs.grablib.org/en/latest/#grab-spider-user-manual

    简单示例代码:

    1. from grab import Grab
    2. # 创建 Grab 实例
    3. g = Grab()
    4. # 设置要抓取的 URL
    5. url = 'https://www.example.com'
    6. g.go(url)
    7. # 输出抓取的页面内容
    8. print("Content of", url)
    9. print(g.response.body)

    3.2.10、Python-goose

    python-goose 是一个轻量级的文章提取库,旨在从网页中提取文章内容。它使用类似于自然语言处理的技术来分析页面,提取标题、作者、正文等信息。官网地址:GitHub - grangier/python-goose: Html Content / Article Extractor, web scrapping lib in Python

    简单示例代码:

    1. from goose3 import Goose
    2. # 创建 Goose 实例
    3. g = Goose()
    4. # 设置要提取的文章 URL
    5. url = 'https://www.example.com/article'
    6. article = g.extract(url)
    7. # 输出提取的信息
    8. print("Title:", article.title)
    9. print("Authors:", article.authors)
    10. print("Publish Date:", article.publish_date)
    11. print("\nArticle Content:\n", article.cleaned_text)

    3.2.11、Cola

    cola 是另一个用于提取文章内容的库,它使用机器学习技术,并具有可配置的规则引擎,可以适应不同的网站结构。cola 的目标是实现高准确性和高可用性。官网地址:GitHub - qinxuye/cola: A high-level distributed crawling framework.

    简单示例代码:

    1. from cola.extractors import ArticleExtractor
    2. # 设置要提取的文章 URL
    3. url = 'https://www.example.com/article'
    4. # 使用 ArticleExtractor 提取文章信息
    5. article = ArticleExtractor().get_article(url)
    6. # 输出提取的信息
    7. print("Title:", article.title)
    8. print("Authors:", article.authors)
    9. print("Publish Date:", article.publish_date)
    10. print("\nArticle Content:\n", article.text)

    4、爬虫策略

    爬虫策略是指在进行网络爬虫操作时制定的一系列规则和策略,用于规范爬取行为、保护被爬取网站和服务器、确保合法合规的数据采集。以下是一些常见的爬虫策略:

    1. 遵守 robots.txt 文件:robots.txt 是网站根目录下的一个文本文件,用于指示爬虫哪些页面可以爬取,哪些不可以。爬虫应该尊重 robots.txt 文件中的规定。
    2. 设置合理的爬取速率:控制爬虫的爬取速率,以避免对目标服务器造成过大的负担。爬虫速度过快可能导致服务器负载过高,影响其他用户访问该服务器。
    3. 使用合法的 User-Agent:设置合法的 User-Agent,模拟正常用户的请求。一些网站可能会禁止爬取行为,特别是对于没有合法 User-Agent 的爬虫。
    4. 处理重试和错误: 确保爬虫能够正确处理页面请求失败、超时等情况,实现自动重试或记录错误信息。这可以提高爬虫的鲁棒性。
    5. 爬取深度和范围控制:设置爬虫的爬取深度和范围,以限制爬取的页面数量。这有助于控制爬虫的规模,避免对目标站点的过度访问。
    6. 使用代理IP池:使用代理服务器来隐藏真实 IP 地址,减少被封禁的风险。代理池可以轮流使用多个代理,避免单个 IP 被封锁。
    7. 定时更新爬虫规则:定期检查目标网站的变化,更新爬虫规则,以适应网站结构的变化。这可以提高爬虫的稳定性和持久性。
    8. 合法数据使用:爬取到的数据只能用于合法用途,不得用于侵犯隐私、侵权、非法竞争等违法活动。遵守法律法规,尊重网站的使用政策。
    9. 尊重隐私和版权:避免爬取包含个人隐私信息的页面,不要违反版权法。在进行爬取时,要考虑到被爬取网站的合法权益。
    10. 合理使用缓存:在适当的情况下使用缓存,避免频繁请求相同的页面,减轻服务器负担。
  • 相关阅读:
    IP代理安全吗?如何防止IP被限制访问?
    4.7 x64dbg 应用层的钩子扫描
    Vue 对话框 Dialog 重新打开后数据重置/清空遗留问题
    浅谈C++
    编程小技巧8-优化日志对象创建代码
    TypeScript学习笔记十二:条件类型、内置条件类型
    【深度学习&图神经网络】Node2Vec +GAT 完成 节点分类任务(含代码) | 附:其它生成节点特征向量的算法:DeepWalk、LINE(具体实现细节)、SDNE、MMDW
    SpringBoot 项目实战 ~ 1. 项目介绍及基础搭建
    3.pytorch学习:conv2d——2d卷积
    从壹开始前后端开发【.Net6+Vue3】(二)前端创建
  • 原文地址:https://blog.csdn.net/p793049488/article/details/140004538