scrapy学習中に発生した問題のまとめ

3833 ワード

1.scrapyはインストールする前にpipをインストールしたことがあるので、pip install scrapyを直接入力すればいいのですが、必要なすべてのコンポーネントが自動的にダウンロードされます.2.scrapyプロジェクトscrapy startproject scrapyspiderこのコマンドは、現在のフォルダの下にscrapyspiderのディレクトリを自動的に作成します.3.爬虫コマンドscrapy crawl yourspidernameを起動します.-o filename.csvに続くと、爬虫類の内容をcsv形式で保存できます.4.爬虫類の作成要件:爬虫類を学びたい目標は最近新しく出た映画を自动的に検索して、映画の番号、名前、カテゴリなどの情报を手に入れて、更に番号でbtサイトに行ってこの资源があるかどうかを検索して、もしあるならば、更に映画の磁力のリンクを保存して、最后にcsvファイルに保存して実践の过程の中でいくつかのとても穴のお父さんの问题に出会って、一つ一つ记录して、参考までに1)scrapy教育のそのサイトはもうありません...2)ターゲットサイト(小黄網)を這い出す場合,新聞403の誤り,すなわちアクセス禁止である.この問題はよくあるので、ネットで調べてみると、user-agentを切り替えておけばいいということです.しかし、穴のお父さんのところに来て、どのようにheadersをカスタマイズするかは言いませんでした.設定にセットすればいいと言われていましたが、それから添えた図はscrapy.cfgに書いてあるので、私はひどく誤解されて、設定したものはすべてここに書くと思っていましたが、結局どうしてもだめでした.実際にはsetting.pyに書くべきです.もう一つの方法は、爬虫類に書いて、リクエストを呼び出すときにheadersをあなたが書いたものに置き換えればいいということです.
   headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36"
    }

headersにはuser-agentだけでなく、たくさん書くことができます.具体的には何を書くことができますか.ブラウザのF 12を開けて、普段インターネットでホームページheadersを閲覧してどのような情報を送ったかをリクエストしてみてください.異なるページの要求に応じて呼び出すために異なるheadersを書くこともできますyield Request(url, headers = self.headers)これでheadersを置き換えることができますheadersを置き換えることができますheadersを交換した後、ウェブサイトにアクセスすることに成功し、希望のページを手に入れました3)文字コードの問題は番号と映画名を手に入れた後、csvファイルを開くのを待つことができなくて、結果的に見るとすべて文字化けしています.これは文字コードの問題だと思います.ネットで調べたらutf-8でエンコードするって言ってたけど、やってみたらダメだった.后で映画の名称がすべて日本语だと思い付いて、gbkコードを使うべきで、试してみてやはり成功してそこで再び爬虫类を起动して、结果は第3ページまで登った时、报告は间违いました.文字コードの問題で、日本語にはいくつかの記号があり、gbkで符号化できませんが、encode方法では、「replace」パラメータを追加して、符号化できない記号を使うことができますか?代わりに、あるいは「ignore」を使って、符号化できない特殊な記号を無視します.パラメータを追加した後、10ページだけ登ることに成功しました(例:
item['title'] = movie.xpath('.//div[@class="photo-info"]/span/text()').extract()[0].encode('GBK','replace')

4)xpathの学習xpathは非常に簡単で、強力で、xpathを利用してすぐに欲しい内容に位置づけることができて、10分の差が少なくて掌握することができます
5)あるページからitemがパラメータとして別のリクエストにどのように渡されるかを取得する
この問題は長い間私を困らせていた.最初は簡単に考えました.私はまず1つのループの中でこのページの中のすべての映画title、番号、対応する次のレベルのページのリンクを獲得して、そこで私はもちろん直接このループの中でそのリンクをrequestしたいと思っています
            yield item
            item['movie_detail'] = movie.xpath('.//a/@href').extract()
            request = Request(url=item['movie_detail'][0],callback=self.parse_detail, headers=self.headers)
            yield request

これは私が最初に書いたコードです.上のyield itemは前の映画titileなどの情報を保存していますが、実行した後に多くのエラーが発生し、希望の結果が得られませんでした.ここでは、Requestリクエストにcallbackを記入して、戻ったデータを誰が処理するかを決めることができます.異なる構造のページは必ず異なる方法で処理しなければなりません.私は無限のトラブルに陥っています.まずyieldがどのように関数を処理しているのかを調べて、yield Requestが非同期であることを知りました.だから、実際に関数にアップロードしたのは最後のmovie_にループしました.detail[0]その後、yeildをどこに置くかを研究したが、どこに置くかは間違っていた.この間、ネットでいろいろ調べたところ、データを渡すにはRequestのmetaパラメータを使うことができることが分かった.しかし、多くの人がこのような言葉を言って、例もなく、詳しく展開していません.具体的にどのように使うのか、私のようなシロは本当に頭が大きいです.その後stackoverflowで親切な人が書いた詳細な例を見つけて、一気に私を開いた.
            item['movie_detail'] = movie.xpath('.//a/@href').extract()
            request = Request(url=item['movie_detail'][0],callback=self.parse_detail, headers=self.headers)
            request.meta['item_1'] = item
            yield request

このようにitemをmetaを介してリクエストに渡すとともに、処理方法に1つ書くことができます.
item_1 = response.meta['item_1']

をクリックしてパラメータを受信します.同じようにitem_を1 item_に渡す2など、爬虫類はデータを持って1級1級下に登ることができて、それから正確に異なるページからのデータを組み合わせて6)反爬虫類は最初は注意していなかったし、速度も制限していなかったので、爬虫類がやっと正常に働いた狂喜の中に浸っていて、結局btサイトにip(喜聞楽見)を閉鎖されたよく見られるいくつかの措置があって、多くのuser-agaentを用意して、爬虫類が働くときはランダムに切り替えます.クッキー禁止設定の遅延が大きいのはsetting.pyで、scrapy.cfgではありません.
一時的に出会った問題はこれだけで、もちろん私が研究した爬虫類とはまだ初級関係がある.今度はjsonのサイトに登ってみます.爬虫類を研究するのは、基礎的なpythonの文法を見たばかりなので、何かを探して手を練習したいだけです.今度の练习の过程の中で収获はやはりとても大きくて、やはり手を出すのが言语の最も良い道を学ぶのです.