python爬虫類爬虫類爬虫類爬虫類爬虫類爬虫類爬虫類爬虫類爬虫類爬虫類爬虫類爬虫類爬虫類爬虫類爬虫類爬虫類爬虫類爬虫類爬虫類

6226 ワード

爬虫類になりたいという考えがあり、ちょうど先月、scrapy、pythonオープンソース爬虫類のフレームワークを学ぶのに十分な時間と精力がありました.いろいろなことが難しいと思っていましたが、本当に決心してやったとき、とても簡単だと気づきました.scrapy私は0の基礎から最初の利用可能な爬虫類を書くまで2日しかかかりませんでした.公式サイトの実例から私のdemoまで、本当に多くの問題に遭遇しました.docsを調べてブログを調べて、一つ一つの問題が解決して、すでにこの枠組みをよく知っていることに気づきました.本当に問題を持って勉強するのが速い学習方法であることに気づいた.大学の時にpythonで爬虫類を書いたことがありますが、フレームワークはあまり使わず、urllibでホームページのソースコードdownを降りた後、正規表現を書いてその内容を抽出して、本当に吐きそうになりました.だから私はずっと爬虫類のホームページの内容の解析が最も面倒なところだと思って、scrapyはxpathの方式を提供してホームページの内容を抽出して、大いに爬虫類の開発を簡素化しました.また、私たち自身が爬虫類を実現するには、すべての爬虫類の動作を管理しなければなりません.あなたはこのページを登り終わったら、次のページをトリガーしなければなりません.banされないように、ヘッダーを構築し、爬虫類のルールを設定しなければなりません.結果を登ることに集中すればいいだけで、残りはmiddleware、pipline、itemと書くだけで......簡単な爬虫類はこれらさえ必要ありません.私はscrapyでチェーン家の中古住宅に登る爬虫類を実現しました.すべてのソースはgithubに置いてあります.https://github.com/xindoo/ershoufang.私が宣言しなければならないのは、これは簡単なdemoにすぎません.いくつかの問題があります.次に、どのような問題があるかを説明してから、コアコードを見てみましょう.
問題1
チェーン家のウェブサイトにも反爬虫戦略とrobots制限があり、robots制限は無視されている(そうでなければ登ることができない)、また頻繁に登るとbanに直接発生し、翌日になってから禁止を解く必要がある.被banを防止する方法は様々である.クッキー禁止2.ヘッダ3を設定する.登り間隔を大きくする.エージェントを使用します.私は最初の3つの方法しか使いませんでした.具体的にはsettingsです.pyとmiddlewares.pyに見えます.無料で使いやすいエージェントがいないので、爬虫類の実際の使用では方法がありません4、私はmiddlewaresにいます.pyにも関連コードが残っていますが、少し参考になりますが、そのエージェントipは使用できないことに注意してください.
問題2
私のコードの中で3000セットの中古住宅の価格だけを登って、北京市が実際に販売している中古住宅は2万セットぐらいあって、私が全部登りたくないのではありませんて、ただチェーン家は100ページ(3000セット)の内容だけを展示して、順序付けの方式は私もよく分かりません.エリアを分けて登ってより多くのデータを得ようとしたが、爬虫類はbanされやすく、数ページ登った後に禁止され、現在はエージェントを使うことでしか解決できないようだ.
問題3
私の登り始めページはhttp://bj.lianjia.com/ershoufang/pg1/ああ、100ページまで登って、コードに注釈したstart_urlsには北京市のすべての区が含まれており、banされなければ、理論的には北京市のすべての中古住宅情報を得ることができる.這い出したデータは以下の通りです.
‘region’:団地‘url’:家屋詳細ページリンク‘houseInfo’:家屋情報は| 3 2 | 126.4 | | | ‘unitPrice’:1平方メートル当たり単価(元)‘totalPrice’:家屋総括(万元)‘attention’:注目される数‘visited’:マネージャーに連れて行かれる回数‘publishday’:家屋が発表される時間
次は爬虫類のコアコードで、すべてのコードは私のgithubで取得することができます.
# -*- coding: utf-8 -*-
import scrapy
import re

class ershoufangSpider(scrapy.Spider):
    name = "ershoufang"
    #            url
    # start_urls = ["http://bj.lianjia.com/ershoufang/dongcheng/pg1", "http://bj.lianjia.com/ershoufang/xicheng/pg1", "http://bj.lianjia.com/ershoufang/chaoyang/pg1", "http://bj.lianjia.com/ershoufang/haidian/pg1", "http://bj.lianjia.com/ershoufang/fengtai/pg1", "http://bj.lianjia.com/ershoufang/shijingshan/pg1", "http://bj.lianjia.com/ershoufang/tongzhou/pg1", "http://bj.lianjia.com/ershoufang/changping/pg1", "http://bj.lianjia.com/ershoufang/daxing/pg1", "http://bj.lianjia.com/ershoufang/yizhuangkaifaqu/pg1", "http://bj.lianjia.com/ershoufang/shunyi/pg1", "http://bj.lianjia.com/ershoufang/fangshan/pg1", "http://bj.lianjia.com/ershoufang/mentougou/pg1", "http://bj.lianjia.com/ershoufang/pinggu/pg1", "http://bj.lianjia.com/ershoufang/huairou/pg1", "http://bj.lianjia.com/ershoufang/miyun/pg1", "http://bj.lianjia.com/ershoufang/yanqing/pg1", "http://bj.lianjia.com/ershoufang/yanjiao/pg1"]
    #                url,    ban
    start_urls = ["http://bj.lianjia.com/ershoufang/pg1"]
    def parse(self, response):
        houses = response.xpath(".//ul[@class='sellListContent']/li")
        for house in houses:
            attention = ''
            visited = ''
            publishday = ''
            try:
                attention = house.xpath(".//div[@class='followInfo']/text()").re("\d+")[0]
                visited = house.xpath(".//div[@class='followInfo']/text()").re("\d+")[1]
                #              ,          。
                if u' ' in house.xpath(".//div[@class='followInfo']/text()").extract()[0].split('/')[2]:
                    number = house.xpath(".//div[@class='followInfo']/text()").re("\d+")[2]
                    publishday = '' + int(number)*30

                elif u' ' in house.xpath(".//div[@class='followInfo']/text()").extract()[0].split('/')[2]:
                    number = house.xpath(".//div[@class='followInfo']/text()").re("\d+")[2]
                    publishday = '365'
                else:
                    publishday = house.xpath(".//div[@class='followInfo']/text()").re("\d+")[2]
            except:
                print "These are some ecxeptions"
            else:
                pass
            yield {
                'region': house.xpath(".//div[@class='houseInfo']/a/text()").extract(),
                'url':house.xpath(".//a[@class='img ']/@href").extract(),
                'houseInfo':house.xpath(".//div[@class='houseInfo']/text()").extract(),
                'unitPrice':house.xpath(".//div[@class='unitPrice']/span").re("\d+.\d+"),
                'totalPrice':house.xpath(".//div[@class='totalPrice']/span").re("\d+.\d+"),
                'attention': attention,
                'visited': visited,
                'publishday': publishday
            }
        page = response.xpath("//div[@class='page-box house-lst-page-box'][@page-data]").re("\d+")
        p = re.compile(r'[^\d]+')
        #           ,           100  ,  for   100
        if len(page)>1 and page[0] != page[1]:
            next_page = p.match(response.url).group()+str(int(page[1])+1)
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)


締めくくり
私がデータで見た結果をいくつか話します.1.publishdayを通じて、平均家屋の残存時間が長くなることを発見しました.2.家の平均価格は先月7万元で、今月は3-5 kほど下がった.3.北京の最も安い家屋の単価は1.6万/平方メートルで、最も高い14.9万/平方メートル(最も高いものと最も安いものはずっと売れていません).住宅市場が少し冷え込んでいることを示しています.改めて、これは3000スイートルームのデータからの統計結果であり、全量家屋の統計結果ではないことを明らかにしました.先月数日のデータを登って、私はこれから毎日定時に1回登ることにしました.長期にわたって蓄積されたデータはきっといくつかの面白い結論を分析することができます.私はすべての登ったデータをftp://xindoo.me/ああ、みんなが手に入れるのに便利です.同時に私のブログにアクセスすることを忘れないでください.http://xindoo.me/.