導入
Web クローラーの世界では、ログインや登録確認などのユーザー認証を必要とする Web ページに直面することがよくあります。この記事では、このようなWebページをScrapy-Seleniumを使って処理し、自動ログインとクローリングを実現する方法を紹介します。
概要
Scrapy-Selenium は、Scrapy と Selenium という 2 つの強力なクローラー ツールを組み合わせたもので、Scrapy フレームワーク内でブラウザーの操作をシミュレートして、認証が必要な Web ページを処理できます。これは、ログインが必要な Web サイトをクロールする場合に特に便利です。
文章
実際のアプリケーションでは、データを取得するためにユーザーにログインを要求する Web サイトが数多くあります。Scrapy-Selenium はユーザーのログイン操作をシミュレートするのに役立ち、クローラーが認証を必要とするページにアクセスできるようになります。
settings.py
まず、プロジェクト内の Selenium 関連の情報とミドルウェア、およびプロキシ設定を構成する必要があります。
SELENIUM_DRIVER_NAME = 'chrome'
SELENIUM_DRIVER_EXECUTABLE_PATH = '/path/to/chromedriver'
SELENIUM_DRIVER_ARGUMENTS = ['--headless'] # 可选,无头模式运行浏览器
DOWNLOADER_MIDDLEWARES = {
'scrapy_selenium.SeleniumMiddleware': 800,
'your_project_name.middlewares.ProxyMiddleware': 750
}
# 亿牛云 设置代理信息
PROXY_HOST = "www.16yun.cn"
PROXY_PORT = "3111"
PROXY_USER = "16YUN"
PROXY_PASS = "16IP"
プロキシ ミドルウェアを次のように記述しますmiddlewares.py
。
class ProxyMiddleware:
def __init__(self, proxy_host, proxy_port, proxy_user, proxy_pass):
self.proxy_host = proxy_host
self.proxy_port = proxy_port
self.proxy_user = proxy_user
self.proxy_pass = proxy_pass
@classmethod
def from_crawler(cls, crawler):
return cls(
proxy_host=crawler.settings.get('PROXY_HOST'),
proxy_port=crawler.settings.get('PROXY_PORT'),
proxy_user=crawler.settings.get('PROXY_USER'),
proxy_pass=crawler.settings.get('PROXY_PASS')
)
def process_request(self, request, spider):
request.meta['proxy'] = f'http://{
self.proxy_user}:{
self.proxy_pass}@{
self.proxy_host}:{
self.proxy_port}'
次に、スパイダーを作成してログイン操作を実装します。ログインが必要な Web サイトをクロールするとします。サンプル コードは次のとおりです。
import scrapy
from scrapy_selenium import SeleniumRequest
class LoginSpider(scrapy.Spider):
name = 'login_spider'
start_urls = ['https://example.com/login']
def parse(self, response):
yield SeleniumRequest(
url=response.url,
callback=self.login,
wait_time=5 # 等待时间,确保页面加载完毕
)
def login(self, response):
self.driver.find_element_by_id('username').send_keys('your_username')
self.driver.find_element_by_id('password').send_keys('your_password')
self.driver.find_element_by_id('login_button').click()
yield SeleniumRequest(
url='https://example.com/data_page',
callback=self.parse_data
)
def parse_data(self, response):
# 解析数据...
上記のコードでは、最初にログイン ページにアクセスし、ユーザーが Selenium を介してユーザー名とパスワードを入力するようシミュレートし、ログイン ボタンをクリックします。ログインに成功した後は、データをクロールするために認証が必要なページに引き続きアクセスできます。
ケース
ログインが必要な Web サイトをクロールし、自動ログインとデータ クロールに Scrapy-Selenium を使用して、そのデータを MongoDB データベースに保存するとします。
import scrapy
from scrapy_selenium import SeleniumRequest
import pymongo
class LoginAndScrapeSpider(scrapy.Spider):
name = 'login_scrape'
start_urls = ['https://example.com/login']
def parse(self, response):
yield SeleniumRequest(
url=response.url,
callback=self.login,
wait_time=5
)
def login(self, response):
self.driver.find_element_by_id('username').send_keys('your_username')
self.driver.find_element_by_id('password').send_keys('your_password')
self.driver.find_element_by_id('login_button').click()
yield SeleniumRequest(
url='https://example.com/data_page',
callback=self.parse_data
)
def parse_data(self, response):
data = response.xpath('//div[@class="data"]/text()').get()
# 存储数据到MongoDB
client = pymongo.MongoClient(host='localhost', port=27017)
db = client['scraped_data']
collection = db['data_collection']
collection.insert_one({
'data': data})
client.close()
エピローグ
Scrapy-Selenium を使用すると、ログインおよび登録認証が必要な Web ページに簡単に対処できます。この記事では、Selenium と Scrapy の構成方法と、自動認証とデータ クロールを実現するための Spider の作成方法、およびクローラーの効率を向上させるプロキシ設定の追加方法を紹介します。このアプローチにより、クローラーの効率と機能が大幅に向上します。
Selenium と Scrapy を組み合わせることで、特にユーザー認証が関係する場合に、さまざまなクローリング タスクをより柔軟かつ効率的に処理できるようになります。これにより、データ収集作業の可能性と利便性がさらに高まります。