网络爬虫-Python网络爬虫和C#网络爬虫

server/2024/10/18 9:34:53/

爬虫是一种从互联网抓取数据信息的自动化程序,通过 HTTP 协议向网站发送请求,获取网页内容,并通过分析网页内容来抓取和存储网页数据。爬虫可以在抓取过程中进行各种异常处理、错误重试等操作,确保爬取持续高效地运行

1、Python网络爬虫

Python 网络爬虫详细介绍
Python网络爬虫是自动化程序,用来抓取网页上的数据。通过网络爬虫,你可以从互联网上采集、处理数据,比如抓取产品信息、新闻内容等。Python因其丰富的库和强大的生态系统,非常适合构建网络爬虫。下面详细介绍Python爬虫的基本流程、常用库、反爬机制以及如何处理爬虫数据。

1. Python 爬虫基本流程

网络爬虫的工作流程主要包括以下步骤:

发送请求:向目标网站发起请求(GET/POST),获取网页内容。
获取响应:服务器返回HTML或JSON等格式的数据。
解析网页:将获取到的网页内容解析,提取目标数据。
数据存储:将提取到的数据保存到文件或数据库中。
递归抓取:如果需要,可以根据页面的链接继续递归抓取其他页面。

2. Python 常用爬虫

Python有多个用于实现网络爬虫的库,以下几个最常用的库是构建爬虫的基础。

(1) Requests 库

Requests是一个简单高效的HTTP库,能够发出请求并接收响应,支持GET、POST等常见的请求方式。

安装 Requests:

pip install requests

基本使用:

import requestsresponse = requests.get('https://example.com')
if response.status_code == 200:print(response.text)  # 打印网页HTML内容

(2) BeautifulSoup 库

BeautifulSoup是一个用于解析HTML/XML的库,能够方便地从网页中提取数据。它可以和Requests一起使用,解析网页内容。

安装 BeautifulSoup:

pip install beautifulsoup4

解析网页内容:

from bs4 import BeautifulSoup
import requestsresponse = requests.get('https://example.com')
soup = BeautifulSoup(response.text, 'html.parser')# 获取网页标题
title = soup.title.string
print(f"网页标题: {title}")# 提取所有链接
links = soup.find_all('a')
for link in links:print(link.get('href'))

(3) lxml 库

lxml是一个性能极佳的HTML/XML解析库,能够快速解析和处理大量网页内容。

安装 lxml:

pip install lxml

使用示例:

from lxml import etree
import requestsresponse = requests.get('https://example.com')
tree = etree.HTML(response.content)# 提取所有链接
links = tree.xpath('//a/@href')
print(links)

(4) Scrapy 爬虫框架

Scrapy是Python最强大的爬虫框架,适用于大型爬虫项目。它支持异步下载、多线程爬取、自动处理链接追踪等。

安装 Scrapy:

pip install scrapy

创建 Scrapy 项目:

scrapy startproject myproject

基本爬虫

i

mport scrapyclass ExampleSpider(scrapy.Spider):name = 'example'start_urls = ['https://example.com']def parse(self, response):for title in response.css('title::text'):yield {'title': title.get()}

3. 反爬机制及其应对

很多网站会有反爬机制,常见的反爬措施有:

IP封禁:频繁请求可能导致IP封禁。
User-Agent 检测:服务器会检查请求头是否为真实浏览器发出的请求。
验证码:通过验证码防止自动化请求。
动态加载内容:使用JavaScript动态加载内容。
应对措施:

设置请求头:通过设置 User-Agent 模拟浏览器访问。
使用代理:通过代理IP避免频繁访问被封禁。
模拟浏览器行为:使用 Selenium 等工具来处理动态加载的内容。
自动识别验证码:使用 OCR 工具(如Tesseract)识别验证码。
设置User-Agent示例:

headers = {'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'
}
response = requests.get('https://example.com', headers=headers)

使用Selenium处理动态内容:

from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://example.com')html = driver.page_source
print(html)
driver.quit()

4. 数据存储

抓取到的数据可以存储为文件或写入数据库。

保存为CSV文件:

import csvwith open('data.csv', mode='w') as file:writer = csv.writer(file)writer.writerow(['Name', 'URL'])writer.writerow(['Example', 'https://example.com'])

存储到数据库:

import pymysqlconn = pymysql.connect(host='localhost', user='user', password='password', db='database')
cursor = conn.cursor()cursor.execute("INSERT INTO table_name (name, url) VALUES (%s, %s)", ('Example', 'https://example.com'))
conn.commit()
conn.close()

C# 网络爬虫详细介绍

C# 也可以用于网络爬虫开发,通过 HTTP 请求获取网页数据并进行解析。与 Python 类似,C# 也有相应的库和框架,虽然 C# 网络爬虫在简便性和灵活性上不如 Python,但在某些企业级应用中,C# 也表现出色。

1. C# 爬虫的基本流程

与 Python 爬虫类似,C# 网络爬虫的基本流程如下:

发送HTTP请求:使用 HttpClient 发送 GET/POST 请求。
获取网页响应:获取网页内容(HTML)。
解析HTML内容:使用正则表达式或 HTML 解析库。
提取并存储数据:提取有用数据,保存到文件或数据库。

2. 常用库

(1) HttpClient

HttpClient 是用于发送 HTTP 请求的 .NET 类,能够轻松地与网页进行交互。

示例代码:

using System;
using System.Net.Http;
using System.Threading.Tasks;class Program
{static async Task Main(string[] args){using (HttpClient client = new HttpClient()){HttpResponseMessage response = await client.GetAsync("https://example.com");string result = await response.Content.ReadAsStringAsync();Console.WriteLine(result);}}
}

(2) HtmlAgilityPack

HtmlAgilityPack 是 C# 的 HTML 解析库,能够方便地从 HTML 中提取数据,类似于 Python 的 BeautifulSoup。

  • 安装 HtmlAgilityPack:
Install-Package HtmlAgilityPack
  • 解析 HTML 并提取数据:
using HtmlAgilityPack;
using System;class Program
{static void Main(string[] args){var url = "https://example.com";HtmlWeb web = new HtmlWeb();var htmlDoc = web.Load(url);var title = htmlDoc.DocumentNode.SelectSingleNode("//title").InnerText;Console.WriteLine("标题: " + title);var links = htmlDoc.DocumentNode.SelectNodes("//a[@href]");foreach (var link in links){Console.WriteLine(link.GetAttributeValue("href", string.Empty));}}
}

(3) 正则表达式

C# 提供了强大的正则表达式库来从网页内容中提取数据。

示例代码:

using System;
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Threading.Tasks;class Program
{static async Task Main(string[] args){using (HttpClient client = new HttpClient()){string content = await client.GetStringAsync("https://example.com");// 使用正则表达式提取所有链接Regex regex = new Regex(@"href=""(.*?)""");MatchCollection matches = regex.Matches(content);foreach (Match match in matches){Console.WriteLine(match.Groups[1].Value);}}}
}

3. 反爬机制应对

与 Python 类似,C# 网络爬虫也需要应对反爬机制。通过设置请求头和使用代理,可以避免被网站封禁。

  • 设置User-Agent:
using System;
using System.Net.Http;class Program
{static async Task Main(string[] args){HttpClientHandler handler = new HttpClientHandler();using (HttpClient client = new HttpClient(handler)){client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");HttpResponseMessage response = await client.GetAsync("https://example.com");string result = await response.Content.ReadAsStringAsync();Console.WriteLine(result);}}
}
  • 使用代理:
HttpClientHandler handler = new HttpClientHandler
{Proxy = new WebProxy("http://yourproxy:8080", true),UseProxy = true
};

4. 数据存储

在 C# 爬虫中,数据可以被保存到文件、数据库等存储方式。

保存为文件:

using System;
using System.IO;class Program
{static void Main(string[] args){string data = "爬虫抓取的数据";File.WriteAllText("data.txt", data);}
}
  • 存储到数据库(SQL Server):
using System;
using System.Data.SqlClient;class Program
{static void Main(string[] args){string connectionString = "Data Source=.;Initial Catalog=myDatabase;Integrated Security=True";using (SqlConnection conn = new SqlConnection(connectionString)){conn.Open();string query = "INSERT INTO WebData (Title, Url) VALUES (@Title, @Url)";using (SqlCommand cmd = new SqlCommand(query, conn)){cmd.Parameters.AddWithValue("@Title", "Example");cmd.Parameters.AddWithValue("@Url", "https://example.com");cmd.ExecuteNonQuery();}}}
}

http://www.ppmy.cn/server/132735.html

相关文章

Javascript算法——双指针法移除元素、数组去重、比较含退格字符、有序数组平方

数组移除元素(保证数组仍连续) 暴力求解法(两层for循环),length单词拼写错误❌二次嵌套for的length设置 /*** param {number[]} nums* param {number} val* return {number}*/ var removeElement function(nums, val) {let leng…

数据结构-排序算法

基于交换的排序算法 快速排序: 最优情况 最优情况下,每次找到的参考轴把数据分成均匀的两半,最后应该是一个平衡二叉树状态;二叉树的层数(logn)即为递归需要进行的次数,并且每轮递归结束时&…

asp.net core _ViewStart.cshtml 和 _ViewImports.cshtml

_ViewStart.cshtml asp.net mvc 就出现了 》》/Views/ViewStart.cshtml _ViewStart.cshtml 是默认模板,当页面没有指定 Layout 时,会自动调用此默认模板‌,如果要取消 在当页面设定 (如下),则表示 当前页面…

【C语言】多文件工程程序,自定义头文件

包含一个主程序,也就是main函数的书写。包含一个头文件的声明文件。包含一个头文件具体函数的实现文件。 注意一点:所有的文件放到一个文件夹没用,必须添加到同一个项目中去才行。 否则 会提示无法识别用户自定义头文件中的函数。 main.c…

进程和线程

文章目录 什么是线程/进程进程进程的特点: 线程线程的特点: 进程与线程的区别:实际应用 什么是线程/进程 进程是资源分配最小单位,线程是程序执行的最小单位 进程 进程是程序的一次执行过程,它是操作系统进行资源分…

[新电脑整理工作]

git 安装python安装 工作需要同时安装py2,和py3,故用anconda 软件,下载并安装成功后 1、conda create -n py2 python2.7 conda cerete -n py3 python3.8 2、安装成功后用VScode直接切换不同环境就可以(原本旧电脑就不可用,可能是vscode 版本有…

Jmeter如何进行多服务器远程测试?

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 JMeter是Apache软件基金会的开源项目,主要来做功能和性能测试,用Java编写。 我们一般都会用JMeter在本地进行测试,但是受到单…

怎么把音频的速度调慢?6个方法调节音频速度

怎么把音频的速度调慢?调慢音频速度不仅可以帮助我们更好地捕捉细节,还能让我们在分析和学习时更加从容。这对于音乐爱好者来说,尤其有助于理解复杂的旋律和和声,使学习过程变得更加高效。而在语言学习中,放慢语速则能…