scrapyインクリメンタルトレース
6305 ワード
爬虫類に触れ始めたときはPythonを初めて習ったので、request、bs 4、pandasを使って、後でscrapyに触れて1、2つの爬虫類を作って、フレームワークがいいと思っていましたが、残念ながら記録も忘れてしまいました.今、推薦システムをするには一定の文章を登る必要があるので、またscrapyを拾いました.この機会に記録を作る.
ディレクトリは次のとおりです.環境 ローカルウィンドウデバッグコマンド 工事目録 xpathセレクタ 簡単な増分爬虫例 構成紹介 環境
自分の環境でscrapyをインストールするには必ずanaconda(anacondaの優位性を再強調
ローカルウィンドウのデバッグと実行
開発時にscrapyが持参したデバッグ機能を利用してシミュレーションリクエストを行うことができ、request、responseは後のコードと同じになります.
新しいエンジニアリング構造の紹介
ページ解析神器——Xpathセレクタ
scrapyはxpathセレクタを持っていて、とても便利で、簡単にいくつかのよく使うことを紹介します
単純なインクリメンタル・登りの例
ここでインクリメンタル・ロールアップの考え方は簡単です.ターゲット・サイトのデータは時間通りに並べられているので、ある接続をrequestする前に、データベースにこのデータがあるかどうかを調べ、ある場合は爬虫類を停止し、リクエストが開始されていない場合は
エンジニアリング構成の概要
要求ヘッダの設定、データベースの構成
ディレクトリは次のとおりです.
自分の環境でscrapyをインストールするには必ずanaconda(anacondaの優位性を再強調
ローカルウィンドウのデバッグと実行
開発時にscrapyが持参したデバッグ機能を利用してシミュレーションリクエストを行うことができ、request、responseは後のコードと同じになります.
#
scrapy shell URL
#
scrapy shell -s USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0" URL
# (json、csv
scrapy crawl SPIDER_NAME -o FILE_NAME.csv
#
scrapy startproject articles # scrapy
新しいエンジニアリング構造の紹介
# spiders ,item.py
# middlewares.py ( ),pipelines.py , item
# settings.py (
├── articles
│ ├── articles
│ │ ├── __init__.py
│ │ ├── items.py
│ │ ├── middlewares.py
│ │ ├── pipelines.py
│ │ ├── settings.py
│ │ └── spiders
│ │ ├── healthy_living.py
│ │ ├── __init__.py
│ │ └── people_health.py
│ └── scrapy.cfg
├── README.en.md
└── README.md
ページ解析神器——Xpathセレクタ
scrapyはxpathセレクタを持っていて、とても便利で、簡単にいくつかのよく使うことを紹介します
# --LinkExtractor, url text(
from scrapy.linkextractors import LinkExtractor
le = LinkExtractor(restrict_xpaths="//ul[@class='nav2_UL_1 clearFix']")# , (for i in le), url(i.url) (i.text)
# class aa div
response.xpath("//div[@class='aa']/text()").extract() # '//' ,'/' , ul
# “ ” a (
response.xpath("//a[contains(text(),' ')]/@href").extract()
単純なインクリメンタル・登りの例
ここでインクリメンタル・ロールアップの考え方は簡単です.ターゲット・サイトのデータは時間通りに並べられているので、ある接続をrequestする前に、データベースにこのデータがあるかどうかを調べ、ある場合は爬虫類を停止し、リクエストが開始されていない場合は
class HealthyLiving(scrapy.Spider):
# ,
name = "healthy_living"
# ,scrapy , lis
start_urls = ['http://www.jkb.com.cn/healthyLiving/']
'''
'''
def parse(self, response):
le = LinkExtractor(restrict_xpaths="//ul[@class='nav2_UL_1 clearFix']")
for link in le.extract_links(response)[1:-1]:
tag = link.text
# , (
meta = {"tag": tag}
# ,
yield scrapy.Request(link.url, callback=self.parse_articles, meta=meta)
'''
'''
def parse_articles(self, response):
#
meta = response.meta
article_links = response.xpath("//div[@class='txt']/h4/a/@href").extract()
for link in article_links:
res = self.collection.find_one({"article_url": link}, {"article_url": 1})
full_meta = dict(meta)
#
full_meta.update({"article_url": link})
if res is None:
yield scrapy.Request(link, callback=self.parse_article, meta=full_meta)
else:
return
next_page = response.xpath("//div[@class='page']//a[contains(text(),'»')]/@href").extract()[0]
if next_page:
yield scrapy.Request(next_page, callback=self.parse_articles, meta=meta)
# ,
def parse_article(self, response):
# item.py
article_item = ArticlesItem()
meta = response.meta
# xpath item
try:
article_item["tag"] = ""
# ...
finally:
yield article_item
エンジニアリング構成の概要
要求ヘッダの設定、データベースの構成
# , middlewares.py , settings.py
class RandomUA(object):
user_agents = [
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit"
"/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit"
"/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"
]
def process_request(self, request, spider):
request.headers["User-Agent"] = random.choice(self.user_agents)
# , pipeline.py , settings.py
class MongoPipeline(object):
def __init__(self, mongo_uri, mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls, crawler):
return cls(
mongo_uri=crawler.settings.get('MONGO_URI'),
mongo_db=crawler.settings.get('MONGO_DB')
)
def open_spider(self, spider):
print(" ", datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def process_item(self, item, spider):
data = self.db[item.collection].find_one({"title": item["title"], "date": item["date"]})
if data is None:
self.db[item.collection].insert(dict(item))
# else:
# self.close_spider(self, spider)
return item
def close_spider(self, spider):
print(" ", datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
self.client.close()
# settings.py : ,
DOWNLOADER_MIDDLEWARES = {
# 'articles.middlewares.ArticlesDownloaderMiddleware': 543,
'articles.middlewares.RandomUA': 543,# 543 ,
}
ITEM_PIPELINES = {
'articles.pipelines.MongoPipeline': 300,
}
#
ROBOTSTXT_OBEY = True # robot
FEED_EXPORT_ENCODING = 'utf-8' #
##
MONGO_URI = ''
MONGO_DB = ''
MONGO_PORT = 27017
MONGO_COLLECTION = ''