記事のディレクトリ
Scrapyクイックスタート
インストールとドキュメント:
- インストール:pip installscrapyを使用してインストールできます。
- Scrapyの公式ドキュメント:http://doc.scrapy.org/en/latest
- Scrapyの中国語ドキュメント:http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html
注意:
- スクレイプをubuntuにインストールする前に、次の依存関係をインストールする必要があります
。sudoapt-get install python3-dev build-essential python3-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev Scrapyをインストールします。 - エラーModuleNotFoundError:「win32api」という名前のモジュールがWindowsシステムでプロンプトが表示されない場合は、次のコマンドを使用して解決します:pip installpypiwin32。
クイックスタート:
プロジェクトの作成:
Scrapyフレームワークを使用してプロジェクトを作成するには、コマンドを使用してプロジェクトを作成する必要があります。まず、このプロジェクトを保存するディレクトリを入力します。次に、次のコマンドを使用して作成します。
scrapy startproject [项目名称]
ディレクトリ構造の紹介:
次に、メインファイルの役割について説明します。
items.py:クローラーによってクロールされたデータを格納するために使用されるモデル。
middlewares.py:さまざまなミドルウェアを格納するために使用されるファイル。
pipes.py:アイテムのモデルをローカルディスクに保存するために使用されます。
settings.py:このクローラーの構成情報(リクエストヘッダー、リクエストの送信頻度、IPプロキシプールなど)。
sparky.cfg:プロジェクトの構成ファイル。
スパイダーパッケージ:将来のすべてのクローラーはこれに格納されます。
Scrapyフレームワークアーキテクチャ
Scrapyフレームワークの紹介:
クローラーを作成するには、多くのことを行う必要があります。例:ネットワークリクエストの送信(urllibライブラリ、リクエストライブラリ)、データ分析(BeautifulSoupライブラリ、xpath分析、正規式、cssセレクター)、データストレージ(excelテーブル、csvファイル、jsonファイル、MySQLデータベース、MongoDBデータベース)、Anti -クローラーメカニズム(ipプロキシの置き換え、リクエストヘッダーの設定など)、非同期リクエストなど。
これらのタスクを毎回最初から作成する必要がある場合は、時間の無駄になります。したがって、Scrapyはいくつかの基本的なものをカプセル化し、それにクローラーを書き込むことでより効率的になる可能性があります(クロール効率と開発効率)。
したがって、社内では、大規模なクローラーの一部はすべてScrapyフレームワークを使用して解決されます。
Scrapyフレームワークモジュールの機能:
- Scrapy Engine:Scrapyフレームワークのコア部分。SpiderとItemPipeline、ダウンローダー、およびスケジューラー間の通信とデータ転送を担当します。
- スパイダー:クロールする必要のあるリンクをエンジンに送信します。最後に、エンジンは他のモジュールから要求されたデータをクローラーに送信し、クローラーは目的のデータを解析します。クロールするリンクと必要なページ内のデータはすべてプログラマー自身が決定するため、この部分は開発者によって作成されています。
- スケジューラー:エンジンから送信された要求の受信、特定の方法での並べ替えと並べ替え、および要求のスケジューリングの順序を担当します。
- ダウンローダー(ダウンローダー):エンジンからダウンロード要求を受信し、ネットワークにアクセスして対応するデータをダウンロードし、エンジンに返します。
- アイテムパイプライン:スパイダーから渡されたデータを保存する責任があります。保存場所は、開発者自身のニーズによって異なります。
- ダウンローダーミドルウェア:ダウンローダーとエンジン間の通信機能を拡張できるミドルウェア。
- スパイダーミドルウェア:エンジンとクローラー間の通信機能を拡張できるミドルウェア。
Scrapy Shell
クローラーでxpath、beautifulsoup、正規表現、cssセレクターなどを使用して、目的のデータを抽出します。しかし、scrapyはより重いフレームワークであるためです。毎回実行するのに時間がかかります。したがって、私たちが書いた抽出ルールが正しいかどうかを確認するのはもっと面倒です。したがって、Scrapyは便利なテストルールのシェルを提供します。もちろん、この機能に限定されるものではありません。
Scrapy Shellを開く:
cmdターミナルを開き、Scrapyプロジェクトが配置されているディレクトリを入力してから、scrapyフレームワークが配置されている仮想環境に入り、コマンドscrapy shell [リンク]を入力します。スクレイプシェル環境に入ります。この環境では、クローラーの解析メソッドと同じように使用できます。
Scrapyフレームワークを使用して、恥ずかしさの百科事典をクロールします。
次のコマンドを使用して、クローラーを作成します。
scrapy startproject qsbk
scrapy gensipder qsbk "qiushibaike.com"
qsbkという名前のクローラーが作成され、クロールできるWebページはドメイン名qiushibaike.comにのみ制限されています。
クローラーコードは次のとおりです。
import scrapy
class QsbkSpider(scrapy.Spider):
name = 'qsbk'
allowed_domains = ['qiushibaike.com']
start_urls = ['http://qiushibaike.com/']
def parse(self, response):
pass
クローラーコード分析:
実際、これらのコードはコマンドなしで手動で記述できます。コマンドが必要ないというだけで、これらのコードを自分で書くのはもっと面倒です。
Spiderを作成するには、クラスをカスタマイズし、scrapy.Spiderから継承してから、このクラスで3つのプロパティと1つのメソッドを定義する必要があります。
- name:このクローラーの名前。名前は一意である必要があります。
- allow_domains:許可されたドメイン名。クローラーはこのドメイン名のWebページのみをクロールし、このドメイン名のない他のWebページは自動的に無視されます。
- start_urls:クローラーはこの変数のURLから開始します。
- 解析:エンジンは、ダウンローダーによってダウンロードされたデータを分析のためにクローラーにスローし、クローラーはデータを解析メソッドに渡します。これは固定された書き方です。この方法には2つの機能があります。1つは目的のデータを抽出することです。2つ目は、次のリクエストURLを生成することです。
settings.pyコードを変更します。
クローラーを作成する前に、setttings.pyの設定を変更することを忘れないでください。2か所を強くお勧めします。
- ROBOTSTXT_OBEYはFalseに設定されています。デフォルトはTrueです。これはマシンプロトコルに準拠するためであり、クロール時に、scrapyは最初にrobots.txtファイルが見つからない場合はそれを探します。次に、直接クロールを停止します。
- DEFAULT_REQUEST_HEADERSはUser-Agentを追加します。これはまた、私のリクエストがクローラーではなく通常のリクエストであることをサーバーに通知します。
完成したクローラーコード:
プロジェクト構造
1.クローラーコードの一部:
# 1.爬虫部分代码:
import scrapy
from qsbk.items import QsbkItem
from scrapy.http.response.html import HtmlResponse
from scrapy.selector.unified import SelectorList
class QsbkSpiderSpider(scrapy.Spider):
#name:这个爬虫的名字,名字必须唯一
name = 'qsbk_spider'
#allowed_domains:允许的域名范围
allowed_domains = ['qiushibaike.com']
#start_urls:爬虫从这个变量中的url开始
start_urls = ['https://www.qiushibaike.com/text/page/1/']
base_domain = "https://www.qiushibaike.com"
def parse(self, response):
duanzidivs = response.xpath("//div[@class='col1 old-style-col1']/div")
for duanzidiv in duanzidivs:
# Selector
author = duanzidiv.xpath(".//h2/text()").get().strip() #strip()是去除前后空白
content = duanzidiv.xpath(".//div[@class='content']//text()").getall()
content = "".join(content).strip() #content就变成字符串str了
# print(content)
item = QsbkItem(author=author, content=content)
# duanzi = {"author":author, "content":content} #定义一个字典存放
yield item
next_url = response.xpath("//ul[@class='pagination']/li[last()]/a/@href").get()
if not next_url:
return
else:
yield scrapy.Request(self.base_domain+next_url,callback=self.parse)
以下は、scrapyシェルによってテストされたコードです
コードの2.items.py部分:
# 2.items.py部分代码:
import scrapy
class QsbkItem(scrapy.Item):
author = scrapy.Field()
content = scrapy.Field()
3.コードのパイプライン部分:
import json
########## 方法一 ##########
# class QsbkPipeline(object):
# def __init__(self):
# self.fp = open("duanzi.json", "w", encoding='utf-8')
#
# def open_spider(self, spider):
# print('爬虫开始了……')
#
# def process_item(self, item, spider):
# item_json = json.dumps(dict(item), ensure_ascii=False)
# self.fp.write(item_json+'\n')
# return item
#
# def close_spider(self, spider):
# self.fp.close()
# print('爬虫结束了…')
########## 方法二 ##########
#### 数据量比较少的时候 可以用JsonItemExporter
from scrapy.exporters import JsonItemExporter
# class QsbkPipeline(object):
# def __init__(self):
# self.fp = open("duanzi.json", "wb") #以二进制的方式写入
# self.exportr = JsonItemExporter(self.fp, ensure_ascii=False, encoding='utf-8')
# self.exportr.start_exporting()
#
# def open_spider(self, spider):
# print('爬虫开始了……')
#
# def process_item(self, item, spider):
# # item_json = json.dumps(dict(item), ensure_ascii=False)
# # self.fp.write(item_json+'\n')
# self.exportr.export_item(item)
# return item
#
# def close_spider(self, spider):
# self.exportr.finish_exporting()
# self.fp.close()
# print('爬虫结束了…')
########## 方法三 ##########
#### 数据量比较多的时候,需要用JsonLinesItemExporter
from scrapy.exporters import JsonLinesItemExporter
class QsbkPipeline(object):
def __init__(self):
self.fp = open("duanzi.json", "wb") #以二进制的方式写入
self.exportr = JsonLinesItemExporter(self.fp, ensure_ascii=False, encoding='utf-8')
def open_spider(self, spider):
print('爬虫开始了……')
def process_item(self, item, spider):
self.exportr.export_item(item)
return item
def close_spider(self, spider):
self.fp.close()
print('爬虫结束了…')
4.コードの一部を設定する
BOT_NAME = 'qsbk'
SPIDER_MODULES = ['qsbk.spiders']
NEWSPIDER_MODULE = 'qsbk.spiders'
ROBOTSTXT_OBEY = False
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36'
}
ITEM_PIPELINES = {
'qsbk.pipelines.QsbkPipeline': 300,
}
DOWNLOADER_MIDDLEWARES = {
'qsbk.middlewares.RandomUserAgentMiddleware': 543,
}
MY_USER_AGENT = [
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
"Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
]
5.ミドルウェアのコードの一部
import random
class RandomUserAgentMiddleware(object):
def __init__(self, user_agents):
self.user_agents = user_agents
@classmethod
def from_crawler(cls, crawler):
# 从settings.py中导入MY_USER_AGENT
s = cls(user_agents=crawler.settings.get('MY_USER_AGENT'))
return s
def process_request(self, request, spider):
agent = random.choice(self.user_agents)
request.headers['User-Agent'] = agent
return None
スクレイピープロジェクトを実行します。
Scrapyプロジェクトを実行します。ターミナルでプロジェクトが配置されているパスを入力する必要がありscrapy crawl [爬虫名字]
ます。そうすると、指定したクローラーを実行できます。毎回コマンドラインで実行したくない場合は、このコマンドをファイルに書き込むことができます。その後、このファイルをpycharmで実行して実行します。たとえば、start.pyという名前の新しいファイルを作成してから、このファイルに次のコードを入力します。
from scrapy import cmdline
cmdline.execute("scrapy crawl qsbk".split())
クロール結果