Scrapy + Seleninm + Scrapy_redisは、コンテンツや写真詳細ページをつかむ使用し、問題やコードを改善する必要が掲載部分の解析や説明を行います。
# - * -コーディング:UTF-8 - * -
インポート時間;
scrapy.linkextractorsインポートLinkExtractorから
scrapy.spidersインポートルールから
scrapy_redis.spidersインポートRedisCrawlSpider#インポートRedisCrawSpiderから、Scrapy_redisの永続性を使用してタスクキューを達成するために(サポートポーズ爬虫類または再起動)し、濾過を繰り返した2セレン輸入webdriverをから、動的なコンテンツを実現するために、無限の流暢さを呼び出すために#インポートwebdriverをするseleninumを取得し、我々はChromeを使用し、あなたはもちろん、ブラウザの多くを使用することができ、あなたがソースコードを見てとることができ、多くのサポート
セレンからを。 webdriver.chrome.optionsはオプション#がChormeブラウザの起動パラメータオプション呼び出し、インポート
scrapyYF.itemsインポートScrapyyfItemから
クラスYaofangSpider(RedisCrawlSpider):
名前を= 'yaofang'
allowed_domains = [ 'www.jian.com']
start_urls = [「HTTPS: //www.jian.com/「]
redis_key =」JK:YP "
#はリストでなければなりません
[=ルール
、偽#フォロー=(従っていない)、ルールに沿った唯一のホーム・ページのURL抽出物は、その後、これらのページにURLデータをクロールコールバックの解析
#従っ=セカンダリURLのページではTrueが(リンクをたどる)、ステーションのクロールが完了するまで、ルールの遵守を求め、その上を続けるURL
#ルール(LinkExtractorは(=(許可 R「\ / C \ / カテゴリ\?CAT_ID = \ D * $「))、)=真に従って、# よりグラブのために、あなたはカテゴリページから、同時にこれを手放すことができますが、適切なコンテンツを見つけることができます
ルール(LinkExtractor(許可=(R&LT '\ /製品\ / \ * .htmlを$ D')、UNIQUE = TRUE)、コールバック= 'parse_druginfo'、フォロー= TRUE)
#規則(LinkExtractor(許可=(R&LT「\ /製品\ /11929.html ')、UNIQUE = TRUE)、コールバック=' parse_druginfo 'フォロー= False)が
#規則(LinkExtractor(許可=(R&LT' \ / Articleこの記事だった\ / \ * $ D「)、UNIQUE = TRUE) 、コールバック= 'parse_item'、フォロー=真)
]
DEF __init __(自己、* argsを、** kwargsから):
スーパー(YaofangSpider、セルフ).__のinit __(* argsを、** kwargsから)#あなたがこのの親を呼び出さない場合は、あるでしょうはAttributeError:エラー'xxxSpider'オブジェクトには、属性'はありません _rules' の
chrome_opt =オプションを();#は、パラメータ設定オブジェクトを作成します。
chrome_opt.add_argument( ' -ヘッドレス);#なしインタフェース技術。
chrome_opt.add_argumentを(' - -disable-GPU「);上記フリーの#嵌合インタフェース。
#上記;.のない嵌合インタフェース- (「無効-infobars」)chrome_opt.add_argument
chrome_opt.add_argument(「 -ウィンドウサイズ= 1366,768」);#設定ウィンドウサイズ、ウィンドウサイズは影響しないであろう
chrome_opt .add_argument( 'ブリンク設定= imagesEnabled =偽');# 禁止負荷絵
#self.bro = webdriver.Chrome(executable_path = r'D:\ Python27 \スクリプト\ chromedriver.exe「)
self.bro = webdriver.Chrome (chrome_options = chrome_opt);
DEF parse_druginfo(セルフ、応答):
商品ScrapyyfItem =();
商品[ 'from_url'] = response.url;
商品[ 'でaddTime'] = time.strftime(「Y - %%% M- H%以下のD:%M:;%のS」、time.localtime())
:%M:%S "時刻%D %% Y-M-%のH項目[ 'を更新']はtime.strftimeの(="。 LOCALTIME())。
項目[ 'CLASS_NAME'] = response.xpath(
'正規化空間(//のdiv [@クラス= "クラム"] / DIV / A [2] /テキスト())')。extract_first()+ '_' response.xpath +(
「正規化空間(// divの[クラス@ = "クラム" ] / DIV / A [3] /テキスト())「)extract_first();#の分類、例えば:中国と西洋医学_男性の薬剤が使用されている上記のpython3に、最初にコンテンツを抽出しextract_first代わりにget()は=のgetAllを抽出し、GET = extract_first
項目[ 'goods_id'] = "jianke_" response.xpath +(
「正規空間(DL // [@クラス= "アソート"] [1] / DD /テキスト()) ')extract_first。 ();#など+ソース固有の識別:jianke_B13003000675
項目[' drug_name '] response.xpath =(
'正規化空間(DL // [クラス@ = "アソートTongyong"] / DD / /テキスト()) ' )extract_first();#の薬剤名:劉魏黄ワン
アイテム[' goods_name「] = response.xpath (
'正規空間(//のdiv [ @クラス= "det_title"] // H1 /テキスト())')extract_first();# 製品名:劉偉黄ワントング仁唐(錠剤)120Sの
項目[ 'grant_number'] response.xpath =(
extract_first();.# '承認番号' '正規空間(DL // [2] / DD /スパン/テキスト())[クラス= "アソート" @]')
項目[「成分'] = response.xpath(
U「正規化空間(// * [@ ID =' b_1_1 '] / TR表// [含まれている(TD、'主原料')] / TD [2] /テキスト()) 「).extract_first();#成分:地黄、肉、ワインのハナミズキ、牡丹皮、山芋、駆虫、サジオモダカ属。XPathの内容は、 "主材料"という名称の抽出
項目[ 'インディクティオ'] = response.xpath(
'、U「正規化空間(// * [@ ID = 'b_1_1'] / TR表// [含み(TD主な役割「)] / TD [2] /テキスト())「)extract_first();# 主要な役割:陰と腎臓。腎臓陰、めまい、耳鳴り、弱い膝、区鄭ほてり、寝汗、夢精の損失のために。
項目[ '標準'] = response.xpath (
u'normalize空間(// * [@ ID = "b_1_1"] /テーブル// TR [TD = " 製品仕様"] / TD [2] /テキスト())「)extract_first();.#の製品仕様:120ピル(丸薬)
項目[ '用途'] = response.xpath(
u'normalize空間(// * [@ ID = "b_1_1"] / TR表// [TD = "投与"] / TD [2] /テキスト()) 「)extract_first();#の投与量:経口。8錠一日三回、一回。
項目[ 'マニュアル'] = " " .join(response.xpath(U '//のdiv [@ ID = "b_2_2"] / DIV /子供:: P')エキス());#は、 コンテンツ記述をフェッチ
項目[ 'IMGSRC'] = response.xpath(U '// divの[ID = "TB21" @] / divの//子:: IMG / SRC @')エキス();.
項目[ 'メーカー'] =レスポンス.xpath(
u'normalize空間(// * [@ ID = "b_1_1"] / TR表// [TD = "メーカー"] / TD [2] /テキスト())「)。
コードの概要:
- 使用RedisCrawSpiderは、タスクをインポートするために実装することができるキューScrapy_redis永続(クローラ支持体が停止または再起動)し、濾過を繰り返した2
- 使用CrawlSpiderまたはRedisCrawSpider、復興_init関数の場合は、親関数を呼び出してください、または報告されますはAttributeError:「をxxxSpider」オブジェクトはありません持っている属性「_rules」 エラーを
- webdriverを使用すると、チューニングなど:.などのクロム、Firefoxの、サファリ、無限のブラウザの多くをすることができ、無限のブラウザにセレンを使用して呼び出し、起動に対応した特定のパラメータを設定することができ、あなたが見ることができるhttps://www.cnblogs.com/jessicorを/p/12072255.html
- extract_first最初のコンテンツを抽出し、のpython3を取得上で使用されて()の代わりにGETALL =エキス、GET = extract_firstの
- XPathの内容は、 "主要材料" という名称抽出// * [ID @ = 'b_1_1'] /テーブル// TR [含み(TD、 '主原料')] / TD [2] /テキスト()
safetyChainMiddlewareクラス(オブジェクト):
DEF process一(セルフ、リクエスト、スパイダー):
Request.Headers [ 'USER_AGENT'] = user_agent.generate_user_agent()の呼び出し番号がランダムヘッダヘッドを生成し、閉鎖を防ぐUSER_AGENT
リファラー= request.url
リファラーIF:
リクエスト.headers [ 'リファラー'] =リファラー # 防止するために封止され生成されたヘッダ情報のReferer、
:クラスseleniumMiddleware(オブジェクト)
DEF isFindElement(セルフ、スパイダー):
トライ:
#spider.bro.find_element_by_id( 'B_2')をクリックし()。 ;
IF WebDriverWait(spider.bro ,. 3).until(
EC.text_to_be_present_in_element((By.XPATH、 "// UL /リー[@ ID =" B_2 "]")、U 'マニュアル')):#0.05msごと要求、要求3Sクロックは、ID = B_2を決定し、タイトルは下のシミュレートクリックアクションが実行されるがあり、仕様要素が存在等しいです
spider.bro.find_element_by_xpath(U "// UL /李 [ID = 'B_2'とテキスト()(含まれている@ ' 説明')]")をクリックします();.
パス
を除い:
#1 spider.bro.quit()
パス
DEFのprocess_response(セルフ、要求、応答、スパイダー):
URL = request.url
画像を直接レスポンスを返された場合のstring.Findに(URL '.JPG')を持っている場合= -1 :!#、HtmlResponseを使用することはできません、そうでない画像あなたは正常またはダウンロードに戻ることはできません
リターンレスポンス
:他に
spider.bro.get(request.url)
リターンHtmlResponse(URL = spider.bro.current_url、ボディ= page_text、エンコーディング=「UTF8」、要求=要求)#戻り無限のブラウザに戻ります応答内容の情報。
- 、user_agentの、プロキシ、リファラやクッキーで、一般的に追加したい、閉鎖を防ぐために、有料の注意をカスタムミドルウェアを追加し、我々は関数の戻り値ことにも注意してください、でprocess_requessに対処しなければならない。別の戻り値、意志さまざまな操作を実行します。
ミドルウェアをダウンロードすることにより、各要求として、メソッドが呼び出されます。
process_request()
そのうちの一つは返さなければなりません:リターンをNone
返すResponse
返されたオブジェクトRequest
のオブジェクトや昇給をIgnoreRequest
。それは返す場合
None
、Scrapyは、適切なハンドラのダウンロード(ダウンロードハンドラ)が呼び出されるまで、要求は(ダウンロードされた応答)が行われ、要求を処理するためのミドルウェア他の対応するメソッドの実行を継続します。それが返された場合は
Response
、オブジェクトを、Scrapyは呼び出しません 任意の 他process_request()
もしくはprocess_exception()
方法、または対応するダウンロード機能を、それが応答を返します。ミドルウェアをインストールしprocess_response()
、各応答が返されたときにメソッドが呼び出されます。それが返された場合は
Request
、オブジェクトを、Scrapy停止はリターンにprocess一方法と再スケジューリング要求を呼び出します。新しい要求が相応に中間チェーンを返すために行われた場合、応答のダウンロードに応じて呼び出されます。それが提起した場合
IgnoreRequest
、例外を、ダウンロードしたミドルウェアのインストールprocess_exception()
メソッドが呼び出されます。例外を処理するために、誰の方法が存在しない場合は、エラーバックの要求(Request.errback
)メソッドが呼び出されます。コードは、例外処理をスローしていない場合、例外が(他の異常とは異なるように)無視され、記録されていません。
-
process_responseは、この治療応答は、写真のため、必ず一人で返すようになる。htmlResponseを使用しないでください。これは、リターンへ無制限ブラウザの内容である。私は判断を行うためにここにいる。そうでなければ画像をダウンロードすることができません。数日間もつれ、最終的に見て良いです文書を見て、ステップの手順でステップ数回は、最終的には.scrapy実行フローが非常に重要である理由を発見しました。
process_responseの戻り値もことに留意すべきです
process_request()
これは、次のいずれかを返す必要がありますへの復帰 Response
のオブジェクトを返す Request
オブジェクトをか上げる IgnoreRequest
例外を。
復帰した場合 Response
(着信応答は同じであってもよいし、または新たなオブジェクトであってもよい)、応答は、他の鎖のミドルウェアであろう process_response()
処理方法。
それが返された場合は Request
、オブジェクトを、要求を停止して返すようにミドルウェア・チェーンは再スケジュールされたダウンロードされます。処理は次のようにある process_request()
要求で行わリターン。
それがスローした場合 IgnoreRequest
、異常を、(エラーバックが呼び出されたリクエストRequest.errback
)。コードは、例外処理をスローしていない場合、例外が(他の異常とは異なるように)無視され、記録されていません。