网页数据采集(Web Scraping)是一种从网站上提取信息的技术。Python 提供了多种库来简化这一过程,其中最常用的是 Scrapy 和 BeautifulSoup。本文将介绍如何使用 Scrapy 框架来采集指定域名下的数据。
目录准备工作安装 Scrapy创建 Scrapy 项目编写 Spider运行 Spider 并保存数据处理反爬机制数据清洗与存储1. 准备工作硬件和软件要求硬件:
至少 2GB 内存至少 20GB 磁盘空间软件:
操作系统:Linux (CentOS, Ubuntu, Debian 等) 或 Windows/MacPython 版本:Python 3.6 及以上安装必要的工具确保你已经安装了 Python 和 pip。如果没有安装,可以通过以下命令安装:
CentOS/RHEL代码语言:javascript代码运行次数:0运行复制bash深色版本sudo yum install python3 python3-pip -yUbuntu/Debian代码语言:javascript代码运行次数:0运行复制bash深色版本sudo apt update && sudo apt upgrade -y
sudo apt install python3 python3-pip -yWindows/Mac可以从 Python 官网 下载并安装最新版本的 Python。
2. 安装 Scrapy使用 pip 安装 Scrapy:
代码语言:javascript代码运行次数:0运行复制bash深色版本pip install scrapy3. 创建 Scrapy 项目打开终端并导航到你希望存放项目的目录,然后运行以下命令创建一个新的 Scrapy 项目:
代码语言:javascript代码运行次数:0运行复制bash深色版本scrapy startproject holybridge_spider
cd holybridge_spider这将创建一个名为 holybridge_spider 的新项目目录。
4. 编写 Spider在 holybridge_spider/spiders 目录下创建一个新的 Spider 文件,例如 novel_spider.py:
代码语言:javascript代码运行次数:0运行复制bash深色版本touch holybridge_spider/spiders/holybridge_spider.py编辑 holybridge_spider.py 文件,添加以下内容:
代码语言:javascript代码运行次数:0运行复制python深色版本import scrapy
from scrapy.http import Request
class HolyBridgeSpider(scrapy.Spider):
name = 'holybridge_spider'
allowed_domains = [
'holybridgelawyer.com',
'sohu.holybridgelawyer.com',
'jim.holybridgelawyer.com',
'wap.holybridgelawyer.com',
'sjb.holybridgelawyer.com',
'sweet.holybridgelawyer.com',
'cctv.holybridgelawyer.com',
'ouguanzhibo.holybridgelawyer.com',
'sina.holybridgelawyer.com',
'share.holybridgelawyer.com',
'zbsjb.holybridgelawyer.com'
]
start_urls = [
'https://www.holybridgelawyer.com',
'https://sohu.holybridgelawyer.com',
'https://jim.holybridgelawyer.com',
'https://wap.holybridgelawyer.com',
'https://sjb.holybridgelawyer.com',
'https://sweet.holybridgelawyer.com',
'https://cctv.holybridgelawyer.com',
'https://ouguanzhibo.holybridgelawyer.com',
'https://sina.holybridgelawyer.com',
'https://share.holybridgelawyer.com',
'https://zbsjb.holybridgelawyer.com'
]
def parse(self, response):
# 提取页面标题
title = response.css('title::text').get()
# 提取所有链接
links = []
for link in response.css('a::attr(href)').getall():
full_url = response.urljoin(link)
links.append(full_url)
yield {
'url': response.url,
'title': title,
'links': links
}
# 遍历所有链接并继续爬取
for link in links:
yield Request(url=link, callback=self.parse)解释代码定义 Spider 类:
name: Spider 的唯一标识符。allowed_domains: 允许爬取的域名列表。start_urls: 开始爬取的 URL 列表。parse 方法:
提取页面标题。提取所有链接,并将其作为数组存储。返回包含当前页面 URL、标题和链接的数据。遍历所有链接并发起新的请求以继续爬取。5. 运行 Spider 并保存数据运行 Spider在项目根目录下运行以下命令启动 Spider:
代码语言:javascript代码运行次数:0运行复制bash深色版本scrapy crawl holybridge_spider -o data.json这将运行 holybridge_spider 并将结果保存到 data.json 文件中。
查看输出文件运行完毕后,可以在项目根目录下找到 data.json 文件,其中包含了爬取的数据。
6. 处理反爬机制许多网站会采取反爬虫措施,如验证码、IP 封禁等。以下是一些常见的处理方法:
使用 User-Agent 轮换修改 settings.py 文件,添加 User-Agent 轮换中间件:
代码语言:javascript代码运行次数:0运行复制python深色版本DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
'scrapy_useragents.middlewares.RandomUserAgentMiddleware': 400,
}
USER_AGENTS = [
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15',
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36',
]设置下载延迟在 settings.py 中设置下载延迟,避免频繁请求导致被封禁:
代码语言:javascript代码运行次数:0运行复制python深色版本DOWNLOAD_DELAY = 2 # 延迟2秒使用代理 IP配置 Scrapy 使用代理 IP 来分散请求来源:
代码语言:javascript代码运行次数:0运行复制python深色版本PROXY_LIST = '/path/to/proxy_list.txt'
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
'scrapy_rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
'scrapy_rotating_proxies.middlewares.BanDetectionMiddleware': 620,
}
ROTATING_PROXY_LIST_PATH = PROXY_LIST
ROTATING_PROXY_LOGSTATS_INTERVAL = 60安装相关扩展安装 scrapy-user-agents 和 scrapy-rotating-proxies 扩展:
代码语言:javascript代码运行次数:0运行复制bash深色版本pip install scrapy-user-agents scrapy-rotating-proxies7. 数据清洗与存储清洗数据在 parse 方法中,可以进一步清洗提取的数据,例如去除多余的空格和特殊字符:
代码语言:javascript代码运行次数:0运行复制python深色版本def parse(self, response):
# 提取页面标题
title = response.css('title::text').get().strip() if response.css('title::text').get() else ''
# 提取所有链接
links = []
for link in response.css('a::attr(href)').getall():
full_url = response.urljoin(link.strip())
links.append(full_url)
yield {
'url': response.url,
'title': title,
'links': links
}
# 遍历所有链接并继续爬取
for link in links:
yield Request(url=link, callback=self.parse)存储数据除了 JSON 格式外,还可以将数据存储到其他格式,如 CSV 或数据库。以下是将数据存储到 SQLite 数据库的示例:
修改 items.py在 holybridge_spider/items.py 文件中定义 Item 结构:
代码语言:javascript代码运行次数:0运行复制python深色版本import scrapy
class HolybridgeSpiderItem(scrapy.Item):
url = scrapy.Field()
title = scrapy.Field()
links = scrapy.Field()修改 settings.py启用管道并将数据存储到 SQLite 数据库:
代码语言:javascript代码运行次数:0运行复制python深色版本ITEM_PIPELINES = {
'holybridge_spider.pipelines.HolybridgeSpiderPipeline': 300,
}
DATABASE = {
'drivername': 'sqlite',
'database': 'holybridge_data.db',
}创建 Pipeline在 holybridge_spider/pipelines.py 文件中添加管道代码:
代码语言:javascript代码运行次数:0运行复制python深色版本import sqlite3
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy.orm import sessionmaker
from .items import HolybridgeSpiderItem
class HolybridgeSpiderPipeline:
def __init__(self):
self.engine = create_engine(f"{self.settings['DATABASE']['drivername']}:///./{self.settings['DATABASE']['database']}")
self.metadata = MetaData()
self.connection = self.engine.connect()
self.Session = sessionmaker(bind=self.engine)
self.session = self.Session()
self.create_tables()
@classmethod
def from_crawler(cls, crawler):
pipeline = cls()
pipeline.crawler = crawler
pipeline.settings = crawler.settings
return pipeline
def create_tables(self):
self.pages_table = Table(
'pages', self.metadata,
Column('id', Integer, primary_key=True),
Column('url', String(255)),
Column('title', String(255)),
Column('links', String(1000))
)
self.metadata.create_all(self.engine)
def process_item(self, item, spider):
if isinstance(item, HolybridgeSpiderItem):
insert_query = self.pages_table.insert().values(
url=item['url'],
title=item['title'],
links=str(item['links'])
)
self.connection.execute(insert_query)
return item
def close_spider(self, spider):
self.session.close()
self.connection.close()运行 Spider 并存储到数据库运行以下命令启动 Spider 并将数据存储到 SQLite 数据库:
代码语言:javascript代码运行次数:0运行复制bash深色版本scrapy crawl holybridge_spider运行完毕后,可以在项目根目录下找到 holybridge_data.db 文件,其中包含了爬取的数据。