成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

爬蟲(chóng)學(xué)習(xí)之基于 Scrapy 的爬蟲(chóng)自動(dòng)登錄

Panda / 1534人閱讀

摘要:概述在前面兩篇爬蟲(chóng)學(xué)習(xí)之基于的網(wǎng)絡(luò)爬蟲(chóng)和爬蟲(chóng)學(xué)習(xí)之簡(jiǎn)單的網(wǎng)絡(luò)爬蟲(chóng)文章中我們通過(guò)兩個(gè)實(shí)際的案例,采用不同的方式進(jìn)行了內(nèi)容提取。

概述

在前面兩篇(爬蟲(chóng)學(xué)習(xí)之基于Scrapy的網(wǎng)絡(luò)爬蟲(chóng)和爬蟲(chóng)學(xué)習(xí)之簡(jiǎn)單的網(wǎng)絡(luò)爬蟲(chóng))文章中我們通過(guò)兩個(gè)實(shí)際的案例,采用不同的方式進(jìn)行了內(nèi)容提取。我們對(duì)網(wǎng)絡(luò)爬蟲(chóng)有了一個(gè)比較初級(jí)的認(rèn)識(shí),只要發(fā)起請(qǐng)求獲取響應(yīng)的網(wǎng)頁(yè)內(nèi)容,然后對(duì)內(nèi)容進(jìn)行格式化存儲(chǔ)。很多時(shí)候我們抓取到的內(nèi)容可能會(huì)發(fā)生重復(fù),也有可能是需要計(jì)算或者組織過(guò)的全新的內(nèi)容甚至是需要登錄后才能訪問(wèn)的內(nèi)容, 那么這一篇我們來(lái)學(xué)習(xí)一下Scrapy的Item部分以及了解如何使用Scrapy來(lái)進(jìn)行自動(dòng)登錄。

起步

首先我們使用Scrapy的命令行創(chuàng)建一個(gè)新的項(xiàng)目

scrapy startproject douban

運(yùn)行后,我們就有了下面這樣的目錄結(jié)構(gòu)

+ douban                               # 根目錄
    |- douban                          # Python的項(xiàng)目目錄
        |- spiders                     # 爬蟲(chóng)Spider部分,用于提取網(wǎng)頁(yè)內(nèi)容
            |- __init__.py
        |- __init__.py
        |- items.py                    # 爬蟲(chóng)item, 用于定義數(shù)據(jù)結(jié)構(gòu)
        |- pipelines.py                # 爬蟲(chóng)pipeline,用于處理提取的結(jié)構(gòu),比如清洗數(shù)據(jù)、去重等
        |- settings.py                 # Scrapy框架參數(shù)項(xiàng)目參數(shù)設(shè)置
    |- scrapy.cfg                      # 爬蟲(chóng)部署相關(guān)設(shè)置

Scrapy為我們生成了已經(jīng)組織好的目錄結(jié)構(gòu),上面的注釋部分解釋了每個(gè)文件及目錄的作用。

建立目標(biāo)

本篇我們來(lái)建立兩個(gè)目標(biāo),這兩個(gè)目標(biāo)都是基于豆瓣網(wǎng):

目標(biāo)一:抓取豆瓣TOP250的圖書(shū)信息并保存成csv文件

目標(biāo)二:抓取我的第一頁(yè)豆郵標(biāo)題(需要登錄),并保存成csv文件

分析目標(biāo)一

目標(biāo)一是豆瓣的TOP250圖書(shū)信息,首先我們進(jìn)入到TOP250的列表(https://book.douban.com/top250) ,我用圖示圈出我們這次要爬取的內(nèi)容,具體請(qǐng)看圖示:

從圖上的框線中我們主要圈出了書(shū)名、價(jià)格、出版年份、出版社、評(píng)分,其中出版年份,出版社以及價(jià)格是在一行中,這個(gè)我們需要進(jìn)一步處理。

分頁(yè)的處理:總記錄是250條,每頁(yè)是25條圖書(shū)信息,共分了10頁(yè)。

實(shí)現(xiàn)目標(biāo)一

需要用到的概念:

Item

Item Pipeline

首先建立Scrapy的Item, Scrapy的Item就是我們需要存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu),先修改items, 然后在spiders目錄中新建一個(gè)名為bookspider.py的Python文件,由于我們需要在一堆字符串中提取出出版社和價(jià)格等信息所以我們這里需要對(duì)抓取的內(nèi)容進(jìn)一步處理, 在這之前還需要修改settings.py文件:

加入faker的模擬USER_AGENT數(shù)據(jù)防止被豆瓣屏蔽,

也可以設(shè)置DEFAULT_REQUEST_HEADERS參數(shù)。

修改ITEM_PIPELINES

代碼如下所示:

items.py

# -*- coding: utf-8 -*-
"""by sudo rm -rf http://imchenkun.com"""
import scrapy


class DoubanBookItem(scrapy.Item):
    name = scrapy.Field()            # 書(shū)名
    price = scrapy.Field()           # 價(jià)格
    edition_year = scrapy.Field()    # 出版年份
    publisher = scrapy.Field()       # 出版社
    ratings = scrapy.Field()         # 評(píng)分

bookspider.py

# -*- coding:utf-8 -*-
"""by sudo rm -rf http://imchenkun.com"""
import scrapy
from douban.items import DoubanBookItem


class BookSpider(scrapy.Spider):
    name = "douban-book"
    allowed_domains = ["douban.com"]
    start_urls = [
        "https://book.douban.com/top250"
    ]

    def parse(self, response):
        # 請(qǐng)求第一頁(yè)
        yield scrapy.Request(response.url, callback=self.parse_next)

        # 請(qǐng)求其它頁(yè)
        for page in response.xpath("http://div[@class="paginator"]/a"):
            link = page.xpath("@href").extract()[0]
            yield scrapy.Request(link, callback=self.parse_next)

    def parse_next(self, response):
        for item in response.xpath("http://tr[@class="item"]"):
            book = DoubanBookItem()
            book["name"] = item.xpath("td[2]/div[1]/a/@title").extract()[0]
            book["price"] = item.xpath("td[2]/p/text()").extract()[0]
            book["ratings"] = item.xpath("td[2]/div[2]/span[2]/text()").extract()[0]
            yield book

pipelines.py

# -*- coding: utf-8 -*-
"""by sudo rm -rf http://imchenkun.com"""


class DoubanBookPipeline(object):
    def process_item(self, item, spider):
        info = item["price"].split(" / ")  # [法] 圣埃克蘇佩里 / 馬振聘 / 人民文學(xué)出版社 / 2003-8 / 22.00元
        item["name"] = item["name"]
        item["price"] = info[-1]
        item["edition_year"] = info[-2]
        item["publisher"] = info[-3]
        return item

最后我們到douban的根目錄中執(zhí)行以下命令來(lái)運(yùn)行爬蟲(chóng)來(lái)執(zhí)行并導(dǎo)出數(shù)據(jù)到csv文件

scrapy crawl douban-book -o douban_book_top250.csv

csv文件截圖如下:

分析目標(biāo)二

目標(biāo)二是建立在理解了目標(biāo)一的基礎(chǔ)上進(jìn)行的,因?yàn)槎拱甑卿洿螖?shù)過(guò)多會(huì)有驗(yàn)證碼出現(xiàn),這里提供一種手工填寫(xiě)驗(yàn)證碼的方式,暫時(shí)不討論如何去識(shí)別驗(yàn)證碼,目標(biāo)二的核心概念是如何提交POST表單和登錄成功后帶Cookie的請(qǐng)求。首先我們可以看到頁(yè)面結(jié)構(gòu)如下圖所示:

實(shí)現(xiàn)目標(biāo)二

定義Item

# -*- coding: utf-8 -*-import scrapy
"""by sudo rm -rf  http://imchenkun.com"""


class DoubanMailItem(scrapy.Item):
    sender_time = scrapy.Field()     # 發(fā)送時(shí)間
    sender_from = scrapy.Field()     # 發(fā)送人
    url = scrapy.Field()             # 豆郵詳細(xì)地址
    title = scrapy.Field()           # 豆郵標(biāo)題

定義doumailspider

# -*- coding:utf-8 -*-
"""by sudo rm -rf  http://imchenkun.com"""
import scrapy
from faker import Factory
from douban.items import DoubanMailItem
import urlparse

f = Factory.create()


class MailSpider(scrapy.Spider):
    name = "douban-mail"
    allowed_domains = ["accounts.douban.com", "douban.com"]
    start_urls = [
        "https://www.douban.com/"
    ]
    headers = {
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Encoding": "gzip, deflate, br",
        "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
        "Connection": "keep-alive",
        "Host": "accounts.douban.com",
        "User-Agent": f.user_agent()
    }

    formdata = {
        "form_email": "您的賬號(hào)",
        "form_password": "您的密碼",
        # "captcha-solution": "",
        # "captcha-id": "",
        "login": "登錄",
        "redir": "https://www.douban.com/",
        "source": "None"
    }

    def start_requests(self):
        return [scrapy.Request(url="https://www.douban.com/accounts/login",
                               headers=self.headers,
                               meta={"cookiejar": 1},
                               callback=self.parse_login)]

    def parse_login(self, response):
        # 如果有驗(yàn)證碼要人為處理
        if "captcha_image" in response.body:
            print "Copy the link:"
            link = response.xpath("http://img[@class="captcha_image"]/@src").extract()[0]
            print link
            captcha_solution = raw_input("captcha-solution:")
            captcha_id = urlparse.parse_qs(urlparse.urlparse(link).query, True)["id"]
            self.formdata["captcha-solution"] = captcha_solution
            self.formdata["captcha-id"] = captcha_id
        return [scrapy.FormRequest.from_response(response,
                                                 formdata=self.formdata,
                                                 headers=self.headers,
                                                 meta={"cookiejar": response.meta["cookiejar"]},
                                                 callback=self.after_login
                                                 )]

    def after_login(self, response):
        print response.status
        self.headers["Host"] = "www.douban.com"
        return scrapy.Request(url="https://www.douban.com/doumail/",
                              meta={"cookiejar": response.meta["cookiejar"]},
                              headers=self.headers,
                              callback=self.parse_mail)

    def parse_mail(self, response):
        print response.status
        for item in response.xpath("http://div[@class="doumail-list"]/ul/li"):
            mail = DoubanMailItem()
            mail["sender_time"] = item.xpath("div[2]/div/span[1]/text()").extract()[0]
            mail["sender_from"] = item.xpath("div[2]/div/span[2]/text()").extract()[0]
            mail["url"] = item.xpath("div[2]/p/a/@href").extract()[0]
            mail["title"] = item.xpath("div[2]/p/a/text()").extract()[0]
            print mail
            yield mail

這里需要注意的有三個(gè)地方:

第一個(gè)是meta中的cookiejar
Scrapy 通過(guò)使用 cookiejar Request meta key來(lái)支持單spider追蹤多cookie session。默認(rèn)情況下其使用一個(gè)cookie jar(session),不過(guò)您可以傳遞一個(gè)標(biāo)示符來(lái)使用多個(gè)。

start_requests 我們這里重寫(xiě)了爬蟲(chóng)爬取得第一個(gè)頁(yè)面,這里一開(kāi)始就進(jìn)去到登錄頁(yè)面

當(dāng)執(zhí)行爬蟲(chóng)的時(shí)候,我們需要把打印出來(lái)的驗(yàn)證碼地址粘貼到瀏覽器中,手動(dòng)輸入到控制上完成驗(yàn)證。

同目標(biāo)一一樣需要設(shè)置settings中的相關(guān)參數(shù),唯一不同的是ITEM_PIPELINES。

最后我們使用以下命令來(lái)啟動(dòng)爬蟲(chóng)

scrapy crawl douban-mail -o douban_mail_page1.csv

csv文件截圖如下:

Github地址:https://github.com/imchenkun/ick-spider/tree/master/douban

總結(jié)

本篇我們學(xué)習(xí)了如果定義Item以及如何對(duì)Item進(jìn)行進(jìn)一步處理(Item Pipeline), 還通過(guò)登錄豆瓣的案例來(lái)了解了如果使用Scrapy進(jìn)行表單提交和Cookie追蹤,也了解了對(duì)于有驗(yàn)證碼的情況該如何處理,當(dāng)然我們這里暫時(shí)還不討論如何識(shí)別驗(yàn)證碼。關(guān)于Scrapy的更高級(jí)的一些用法和特性可以進(jìn)一步閱讀Scrapy官網(wǎng)的文檔。

特別申明:本文所提到的豆瓣網(wǎng)只是拿來(lái)進(jìn)行爬蟲(chóng)的技術(shù)交流學(xué)習(xí),讀者涉及到的所有侵權(quán)問(wèn)題都與本人無(wú)關(guān),也希望大家在學(xué)習(xí)實(shí)戰(zhàn)的過(guò)程中不要大量的爬取內(nèi)容對(duì)服務(wù)器造成負(fù)擔(dān)

本文首發(fā)在sudo rm -rf 采用署名(BY)-非商業(yè)性使用(NC)-禁止演繹(ND) 轉(zhuǎn)載請(qǐng)注明原作者

--EOF--

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/38070.html

相關(guān)文章

  • 爬蟲(chóng)學(xué)習(xí)之基于Scrapy網(wǎng)絡(luò)爬蟲(chóng)

    摘要:不過(guò)不用擔(dān)心,中有很多非常優(yōu)秀的爬蟲(chóng)框架,比如我們接下來(lái)要學(xué)習(xí)到的。結(jié)合以上分析我們基本確定了本次爬蟲(chóng)的各個(gè)路線入口,接下來(lái)我們就開(kāi)始通過(guò)程序來(lái)實(shí)現(xiàn)本次的目標(biāo)。這里我們的目的是建立一種寫(xiě)爬蟲(chóng)的思路,而不在于怎么使用工具來(lái)爬數(shù)據(jù)。 概述 在上一篇文章《爬蟲(chóng)學(xué)習(xí)之一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲(chóng)》中我們對(duì)爬蟲(chóng)的概念有了一個(gè)初步的認(rèn)識(shí),并且通過(guò)Python的一些第三方庫(kù)很方便的提取了我們想要的內(nèi)容,但是...

    BingqiChen 評(píng)論0 收藏0
  • 首次公開(kāi),整理12年積累博客收藏夾,零距離展示《收藏夾吃灰》系列博客

    摘要:時(shí)間永遠(yuǎn)都過(guò)得那么快,一晃從年注冊(cè),到現(xiàn)在已經(jīng)過(guò)去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時(shí)候把他們整理一下了。那是因?yàn)槭詹貖A太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...

    Harriet666 評(píng)論0 收藏0
  • 零基礎(chǔ)如何學(xué)爬蟲(chóng)技術(shù)

    摘要:楚江數(shù)據(jù)是專(zhuān)業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲(chóng)技術(shù)以供學(xué)習(xí),。本文來(lái)源知乎作者路人甲鏈接楚江數(shù)據(jù)提供網(wǎng)站數(shù)據(jù)采集和爬蟲(chóng)軟件定制開(kāi)發(fā)服務(wù),服務(wù)范圍涵蓋社交網(wǎng)絡(luò)電子商務(wù)分類(lèi)信息學(xué)術(shù)研究等。 楚江數(shù)據(jù)是專(zhuān)業(yè)的互聯(lián)網(wǎng)數(shù)據(jù)技術(shù)服務(wù),現(xiàn)整理出零基礎(chǔ)如何學(xué)爬蟲(chóng)技術(shù)以供學(xué)習(xí),http://www.chujiangdata.com。 第一:Python爬蟲(chóng)學(xué)習(xí)系列教程(來(lái)源于某博主:htt...

    KunMinX 評(píng)論0 收藏0
  • 爬蟲(chóng)爬 JSON HTML 數(shù)據(jù)

    摘要:最近這兩周在忙著給公司爬一點(diǎn)數(shù)據(jù),更文的速度有一點(diǎn)下降,預(yù)計(jì)今天就爬完了,總結(jié)總結(jié)經(jīng)驗(yàn)。一個(gè)爬蟲(chóng)的框架?;镜葍r(jià)于選擇其中的文字提取屬性文檔,這個(gè)我不會(huì),我也沒(méi)看使用這個(gè)類(lèi)庫(kù)解析如請(qǐng)求方式可以用來(lái)給中文字符數(shù)據(jù)放入傳遞即可。 最近這兩周在忙著給公司爬一點(diǎn)數(shù)據(jù),更文的速度有一點(diǎn)下降,預(yù)計(jì)今天就爬完了,總結(jié)總結(jié)經(jīng)驗(yàn)。 其實(shí)之前我司是有專(zhuān)門(mén)做爬蟲(chóng)的,不用前端這邊出人干活。后來(lái)那人離職了,有可...

    Hegel_Gu 評(píng)論0 收藏0
  • 爬蟲(chóng)爬 JSON HTML 數(shù)據(jù)

    摘要:最近這兩周在忙著給公司爬一點(diǎn)數(shù)據(jù),更文的速度有一點(diǎn)下降,預(yù)計(jì)今天就爬完了,總結(jié)總結(jié)經(jīng)驗(yàn)。一個(gè)爬蟲(chóng)的框架?;镜葍r(jià)于選擇其中的文字提取屬性文檔,這個(gè)我不會(huì),我也沒(méi)看使用這個(gè)類(lèi)庫(kù)解析如請(qǐng)求方式可以用來(lái)給中文字符數(shù)據(jù)放入傳遞即可。 最近這兩周在忙著給公司爬一點(diǎn)數(shù)據(jù),更文的速度有一點(diǎn)下降,預(yù)計(jì)今天就爬完了,總結(jié)總結(jié)經(jīng)驗(yàn)。 其實(shí)之前我司是有專(zhuān)門(mén)做爬蟲(chóng)的,不用前端這邊出人干活。后來(lái)那人離職了,有可...

    cocopeak 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<