初心者の爬虫類の概要

クロールページの基本的な手順

クロール1.1決定データ

クローラの役割は、データが必要なものを決定する前に、大規模なWebページを取り込むために必要なデータをクロールしています。二手の一例として、住宅価格、我々は長沙市で行う必要がある場合、中古住宅価格は、断面回帰分析、我々は、中古住宅価格に関連する因子を発見する必要があります(????いくつかのホール朝陽のいくつかの部屋新しく改装されたかどうかバルコニーがあるかどうか)中古住宅の種類中古住宅の場所、価格(元/平方メートル)、財産の年齢のように。

1.2クロールページを決定します

クローラ速く、彼らは可能な限り登るために必要なデータを取得するために、全体の大規模なネットワークから、インターネット全体を検索することはできません、サイトに表示され、彼らが必要とするデータを決定する必要があります。私たちは、あなたがデータを見つける必要があると判断した場合の例として、二手の住宅価格は、我々はウェブサイトのいくつかのデータを見つけるためにGoogleにBaiduの上で使用される価格を検索する必要がありますなどのライブオフ、家族の連鎖を、そして私たちの目標は、これらをクロールすることです商用サイト。

1.3分析ページ

最初のページを登ることができるかどうかを分析すべきである(抗登るの?)、あなたは自動的に初期のランダムなユーザーエージェントは、クロール設定ページでは、クロール、その後、あなただけの、例えば、非常に詳細なコードを書くことができないという単純なコードを書くことができますクロールタイトル。あなたはシールIPに数回訪問し、サイトに非常に深刻な抗登るを見つけた場合は、問題のアカウントのログインパスワード、認証コードすることもできますシミュレート亀裂を保存したり、お金自動から抜け出すためにクッキーを使用することなど再ログインや検証コードを、必要としますが、一般的にそれをあなたのIPアドレスのシール他人を停止することはできません、もちろん、薬を見つけるための最善の方法です。あなたのIPアドレスを封印していない約千ページと他人の上昇を見つけた場合は、サイトをクロールできることを示すデータは、次のステップは、有用なデータのページを見つけることですが、データは必ずしもHTMLで記述された可視のWebページではありませんそれは「チェック」別に見ると、ページのソースコードビューを必要とJSONまたはデータベースに書かれたかの仕事をしない、いくつかの結果を示してレンダリングすることができる、あなたは内「の表示ページのソース」からHTMLコードを表示する必要があります。ページのどの部分のデータを有用見つけることが、その後にのみこれらのページのルートから始まる、良いルートURLを決定する必要があり、これらのページの同じ一般的な構造は、トラバースすることができます。

1.4クロールページ

そこ爬虫類を横断するには2つの方法があり、また、「幅優先」「深さ優先」を記述するためには、ルートから、爬虫類は、ネットワークマップから、このページをクロールしていることができますが、異なる方法でウェブページの品質を決定するなど、ページ数が1000のためにクロール設定深さ優先探索があまりにも多くのテーマや少なすぎる他のテーマの表示されることがあり、および各優先テーマの幅が均等に分散させる場合は、それは、書き込み爬虫類に幅優先使用することが提案されています。
プロセスをクロールするページを取り除くためにごみの多くを必要、またはページがクロールのみの特定のタイプを定義することができ、一般的に利用ポジティブに良いドメイン名とURLフィルタ式を定義します。
URLを入力すると、Webページの構文解析クロール必要とされた後、このような正規表現、beautifulSoup、XPathの、同じ目的を果たすなど、多くの分析方法、ありますが、正規表現は、最も基本的なコース必見のマスターである、後者の二つは、XMLにありますツリー解析は、缶を学びます。これは死者を書くことと等価であるため、解決プロセスは、beautifulsoupまたは汎用性のXPathの解像度、より少ない解決特定のインデックスに注意を払う必要があり、Webページの広告挿入の真ん中には、アクセスデータではないに変位指標をもたらすことができます。

1.5保存データ

データはデータベースに保存され、保存されたクロール?JSON?XLSX?CSV?というように、バイナリモードで記述されたファイルフォルダの各タイプのためのデータポイント?フォーマットをコードしますか?これらは考慮されるべきです。

二、普通爬虫

  1. リクエスト
 response = requests.get(url, timeout=1, headers=headers1)
  1. ヘッダ
 headers1={
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36'
}
  1. 正規表現
 response.encoding = 'utf-8'
    html = response.text
    # 解析网页
    urls = re.findall('href="(.*?)"', html)
    urls += re.findall('src="(.*?)"', html)
  1. 保存
dir_name="blog_url/asdf"+str(cnt_page)+".txt"
    with open(dir_name, 'w',encoding='utf-8') as f:
        f.write(url+" ")
        for url in urls:
            str1 = url.split('.')[-1]
            if "blog.sina" in url and (('/' in str1) or 'html'in str1 or "cn" in str1):
                f.write(url+" ")

  1. &&広い重複排除を検索
cnt_page=0

is_history=set()
url_queue=Queue()
def spide_xx(url):#从某个根界面开始爬取,保存在dir_name中

    global  cnt_page

    url_queue.put(url)
    while url_queue.empty()==False and cnt_page<10000:
        try:
            cnt_page = cnt_page + 1
            cur_url=url_queue.get();
            is_history.add(cur_url)
            get_url_txt(cur_url)
            urls=get_url_src(cur_url)

            for url in urls:
                str = url.split('.')[-1]
                if "blog.sina" in url and (('/' in str) or 'html'in str or "cn" in str):
                    if (url in is_history) == False:
                        print(url)
                        url_queue.put(url)
        except:
            print("访问超时!")
    return

三、scrapyフレームワーク

長沙の中古住宅の基本的な情報をクロール例えば、ホームサイトの以下のチェーンと、インストールされていると仮定し、同様にインストールしないように、ここで、基本的な使用scrapyを説明しています。
Scrapy startprojectのXXXXコマンドは、フレームワーククローラscrapyプロジェクト作成するために、
CDをXXXX
scrapy genspider -tクロールxxxのドメインcrawlspiderクローラ作成するために
、ライトドライバスクリプトmain.pyを:

from scrapy import cmdline
cmdline.execute('scrapy crawl housing_price_crawl'.split())

クロールxxxの「XXX」爬虫類の名前があるが、開始scrapy爬虫類を開始するために使用される、ここhousing_price_crawl.py

ここに画像を挿入説明
簡単に言えば、それぞれのファイルには、やってPYを生産しているEXPLAIN:housing_price_crawl.pyをWebページを解析するため、および他のルールはどこ登山を開始するために、item.pyので、クラスにデータパッケージをクロールして、オブジェクトの形で送信することが予めitem.pyで定義された、独自のミドルウェアを定義middlewares.py、ミドルウェア処理は、主に抗 - 抗クローラーに使用され、ランダムにユーザーエージェントを配置し、ここで、ランダムにIPに配置されている。pipelines.py導管を上昇するための大容量記憶した後ルールの定義は、項目オブジェクトに格納されたデータ、; setting.pyセット構成scrapyフレーム、robot.txt、オープンミドルウェア、パイプライン、ユーザーエージェントを読み取るかどうか、どのように多くのページの後に停止クロール、深さ優先または幅優先など。

書き込みhousing_price_crawl.py、ホーム・ページのURLのチェーンがdiv要素のパッケージであるため、彼らは唯一のURLを取得するために独自のコードを書くことができますので、私は、LinkExtractorことで、現在のページのURLの全てを取得することはできませんので、正確なURLを取得することはできませんが、次のページに解決されます。各ページの抽出セル名、地名、いくつかの部屋のいくつかの部屋、単価。推奨scrapyシェルのXPath事前または定期的な検査が正しいです。

#items.py
import scrapy

class ChangshahousingpriceItem(scrapy.Item):
    name=scrapy.Field()
    position=scrapy.Field()
    type=scrapy.Field()
    price=scrapy.Field()
# -*- coding: utf-8 -*- housing_price_crawl.py
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from ChangShaHousingPrice.items import ChangshahousingpriceItem
import json
from scrapy.loader import ItemLoader

class HousingPriceCrawlSpider(CrawlSpider):
    name = 'housing_price_crawl'
    allowed_domains = ['cs.lianjia.com']
    start_urls = ['https://cs.lianjia.com/ershoufang/yuhua/rs%E9%95%BF%E6%B2%99/']

    rules = (
        Rule(LinkExtractor(allow=r'.*/ershoufang/.*/rs长沙/'), callback='page_request', follow=True),
        #Rule(LinkExtractor(allow=r'https://cs.lianjia.com/ershoufang/\d+.html'), callback='parse_item', follow=False),
    )

    def page_request(self, response):
        # link=LinkExtractor(allow=r'https://cs.lianjia.com/ershoufang/\d+.html')
        # print(link.extract_links(response))
        root_path=response.xpath("//div[@class='page-box house-lst-page-box']/@page-url").get()
        max_page=response.xpath("//div[@class='page-box house-lst-page-box']/@page-data").get()
        if(max_page is not None):
            max_page = json.loads(max_page)
            max_page=max_page["totalPage"]
            root_path+='/'
            for i in range(1,max_page+1):
                path=root_path.replace('{page}',str(i))
                path='https://cs.lianjia.com'+path
                print(path)
                yield scrapy.Request(path,callback=self.page_info)

    def page_info(self,response):
        link = LinkExtractor(allow=r'https://cs.lianjia.com/ershoufang/\d+.html')
        urls=link.extract_links(response)
        for url in urls:
            url=url.url
            yield scrapy.Request(url, callback=self.parse_item)

    def parse_item(self, response):
        l=ItemLoader(item=ChangshahousingpriceItem(),response=response)
        l.add_xpath('name',"//div[@class='communityName']/a[@class='info ']/text()")
        l.add_value('position'," ".join(response.xpath("//div[@class='areaName']/span[@class='info']/a[@target='_blank']/text()").getall()))
        l.add_value('type',response.xpath("//div[@class='mainInfo']/text()").get())
        l.add_value('price',response.xpath("//span[@class='unitPriceValue']/text()").get()+response.xpath("//span[@class='unitPriceValue']/i/text()").get())
        # item=ChangshahousingpriceItem()
        # item['name']=response.xpath("//div[@class='communityName']/a[@class='info ']/text()").get()
        # item['position']=" ".join(response.xpath("//div[@class='areaName']/span[@class='info']/a[@target='_blank']/text()").getall())
        # item['type']=response.xpath("//div[@class='mainInfo']/text()").get()
        # item['price']=response.xpath("//span[@class='unitPriceValue']/text()").get()+response.xpath("//span[@class='unitPriceValue']/i/text()").get()
        return l.load_item()

ミドルウェアは、ランダムなユーザーエージェントを提供しました


class ChangshahousingpriceDownloaderMiddleware(object):
    # Not all methods need to be defined. If a method is not defined,
    # scrapy acts as if the downloader middleware does not modify the
    # passed objects.
    USER_AGENTS = [
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.157 Safari/537.36',
        'Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Acoo Browser 1.98.744; .NET CLR 3.5.30729)',
        'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6788.400 QQBrowser/10.3.2816.400',
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0',
        'Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.8.1.11) Gecko/20080118 Firefox/2.0.0.11',
        'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Deepnet Explorer 1.5.3; Smart 2x2; .NET CLR 2.0.50727; .NET CLR 1.1.4322; InfoPath.1)',
        'ELinks/0.9.3 (textmode; Linux 2.6.9-kanotix-8 i686; 127x41)',
        'Mozilla/5.0 (X11; U; Linux x86_64; it-it) AppleWebKit/534.26+ (KHTML, like Gecko) Ubuntu/11.04 Epiphany/2.30.6',
        'Mozilla/5.0 (Windows; U; Windows NT 6.1; x64; fr; rv:1.9.2.13) Gecko/20101203 Firebird/3.6.13',
        'Mozilla/5.0 (Macintosh; PPC Mac OS X 10_5_8) AppleWebKit/537.3+ (KHTML, like Gecko) iCab/5.0 Safari/533.16',
        'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.13) Gecko/20100916 Iceape/2.0.8',
        'Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20121201 icecat/17.0.1',
        'Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20121202 Firefox/17.0 Iceweasel/17.0.1',
        'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; AS; rv:11.0) like Gecko',
        'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.21pre) Gecko K-Meleon/1.7.0',
        ]
    @classmethod
    def from_crawler(cls, crawler):
        # This method is used by Scrapy to create your spiders.
        s = cls()
        crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
        return s

    def process_request(self, request, spider):
        user_agent = random.choice(self.USER_AGENTS)
        request.headers['User-Agent'] = user_agent
        return None

    def process_response(self, request, response, spider):
        # Called with the response returned from the downloader.

        # Must either;
        # - return a Response object
        # - return a Request object
        # - or raise IgnoreRequest
        return response

    def process_exception(self, request, exception, spider):
        # Called when a download handler or a process_request()
        # (from other downloader middleware) raises an exception.

        # Must either:
        # - return None: continue processing this exception
        # - return a Response object: stops process_exception() chain
        # - return a Request object: stops process_exception() chain
        pass

    def spider_opened(self, spider):
        spider.logger.info('Spider opened: %s' % spider.name)

pipelines.py:設定は、CSVファイルに格納されています

import csv
import os
class ChangshahousingpricePipeline(object):
    def __init__(self):
        # csv文件的位置,无需事先创建
        store_file = os.path.dirname(__file__) + '/spiders/长沙二手房价.csv'
        # 打开(创建)文件
        self.file = open(store_file, 'w+',newline="",encoding='utf-8')
        # csv写法
        self.writer = csv.writer(self.file)

    def process_item(self, item, spider):
        # 判断字段值不为空再写入文件
        self.writer.writerow((item['name'],item['position'],item['type'],item['price']))
        return item

    def close_spider(self,spider):
        self.file.close()

コンフィギュレーション設定

BOT_NAME = 'ChangShaHousingPrice'

SPIDER_MODULES = ['ChangShaHousingPrice.spiders']
NEWSPIDER_MODULE = 'ChangShaHousingPrice.spiders'
ROBOTSTXT_OBEY = False
DOWNLOADER_MIDDLEWARES = {
   'ChangShaHousingPrice.middlewares.ChangshahousingpriceDownloaderMiddleware': 543,
}
ITEM_PIPELINES = {
   'ChangShaHousingPrice.pipelines.ChangshahousingpricePipeline': 300,
}

結果:
ここに画像を挿入説明

公開された41元の記事 ウォンの賞賛2 ビュー1225

おすすめ

転載: blog.csdn.net/qq_41418281/article/details/103958772