爬蟲學習之基於 Scrapy 的爬蟲自動登入
概述
在前面兩篇(爬蟲學習之基於Scrapy的網路爬蟲和爬蟲學習之簡單的網路爬蟲)文章中我們通過兩個實際的案例,採用不同的方式進行了內容提取。我們對網路爬蟲有了一個比較初級的認識,只要發起請求獲取響應的網頁內容,然後對內容進行格式化儲存。很多時候我們抓取到的內容可能會發生重複,也有可能是需要計算或者組織過的全新的內容甚至是需要登入後才能訪問的內容, 那麼這一篇我們來學習一下Scrapy的Item部分以及瞭解如何使用Scrapy來進行自動登入。
起步
首先我們使用Scrapy的命令列建立一個新的專案
1 | scrapy startproject douban |
執行後,我們就有了下面這樣的目錄結構
123456789 | +douban# 根目錄|-douban# Python的專案目錄|-spiders# 爬蟲Spider部分,用於提取網頁內容|-__init__.py|-__init__.py|-items.py# 爬蟲item, 用於定義資料結構|-pipelines.py# 爬蟲pipeline,用於處理提取的結構,比如清洗資料、去重等|-settings.py# Scrapy框架引數專案引數設定|-scrapy.cfg# 爬蟲部署相關設定 |
Scrapy為我們生成了已經組織好的目錄結構,上面的註釋部分解釋了每個檔案及目錄的作用。
建立目標
本篇我們來建立兩個目標,這兩個目標都是基於豆瓣網:
- 目標一:抓取豆瓣TOP250的圖書資訊並儲存成csv檔案
- 目標二:抓取我的第一頁豆郵標題(需要登入),並儲存成csv檔案
分析目標一
目標一是豆瓣的TOP250圖書資訊,首先我們進入到TOP250的列表(https://book.douban.com/top250) ,我用圖示圈出我們這次要爬取的內容,具體請看圖示:
從圖上的框線中我們主要圈出了書名、價格、出版年份、出版社、評分,其中出版年份,出版社以及價格是在一行中,這個我們需要進一步處理。
分頁的處理:總記錄是250條,每頁是25條圖書資訊,共分了10頁。
實現目標一
需要用到的概念:
- Item
- Item Pipeline
首先建立Scrapy的Item, Scrapy的Item就是我們需要儲存的資料結構,先修改items, 然後在spiders目錄中新建一個名為bookspider.py的Python檔案,由於我們需要在一堆字串中提取出出版社和價格等資訊所以我們這裡需要對抓取的內容進一步處理, 在這之前還需要修改settings.py檔案:
- 加入faker的模擬USER_AGENT資料防止被豆瓣遮蔽,
- 也可以設定DEFAULT_REQUEST_HEADERS引數。
- 修改ITEM_PIPELINES
程式碼如下所示:
items.py
1234567891011 | # -*- coding: utf-8 -*-'''by sudo rm -rf http://imchenkun.com'''import scrapyclassDoubanBookItem(scrapy.Item):name=scrapy.Field()# 書名price=scrapy.Field()# 價格edition_year=scrapy.Field()# 出版年份publisher=scrapy.Field()# 出版社ratings=scrapy.Field()# 評分 |
bookspider.py
1234567891011121314151617181920212223242526272829 | # -*- coding:utf-8 -*-'''by sudo rm -rf http://imchenkun.com'''import scrapyfrom douban.items import DoubanBookItemclassBookSpider(scrapy.Spider):name='douban-book'allowed_domains=['douban.com']start_urls=['https://book.douban.com/top250']def parse(self,response):# 請求第一頁yield scrapy.Request(response.url,callback=self.parse_next)# 請求其它頁forpage inresponse.xpath('//div[@class="paginator"]/a'):link=page.xpath('@href').extract()[0]yield scrapy.Request(link,callback=self.parse_next)def parse_next(self,response):foritem inresponse.xpath('//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
123456789101112 | # -*- coding: utf-8 -*-'''by sudo rm -rf http://imchenkun.com'''classDoubanBookPipeline(object):def process_item(self,item,spider):info=item['price'].split(' / ')# [法] 聖埃克蘇佩裡 / 馬振聘 / 人民文學出版社 / 2003-8 / 22.00元item['name']=item['name']item['price']=info[-1]item['edition_year']=info[-2]item['publisher']=info[-3]returnitem |
最後我們到douban的根目錄中執行以下命令來執行爬蟲來執行並匯出資料到csv檔案
1 | scrapy crawl douban-book-odouban_book_top250.csv |
csv檔案截圖如下:
分析目標二
目標二是建立在理解了目標一的基礎上進行的,因為豆瓣登入次數過多會有驗證碼出現,這裡提供一種手工填寫驗證碼的方式,暫時不討論如何去識別驗證碼,目標二的核心概念是如何提交POST表單和登入成功後帶Cookie的請求。首先我們可以看到頁面結構如下圖所示:
實現目標二
定義Item
123456789 | # -*- coding: utf-8 -*-import scrapy'''by sudo rm -rf http://imchenkun.com'''classDoubanMailItem(scrapy.Item):sender_time=scrapy.Field()# 傳送時間sender_from=scrapy.Field()# 傳送人url=scrapy.Field()# 豆郵詳細地址title=scrapy.Field()# 豆郵標題 |
定義doumailspider
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 | # -*- coding:utf-8 -*-'''by sudo rm -rf http://imchenkun.com'''import scrapyfrom faker import Factoryfrom douban.items import DoubanMailItemimport urlparsef=Factory.create()classMailSpider(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':'您的賬號','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):# 如果有驗證碼要人為處理if'captcha_image'inresponse.body:print'Copy the link:'link=response.xpath('//img[@class="captcha_image"]/@src').extract()[0]print linkcaptcha_solution=raw_input('captcha-solution:')captcha_id=urlparse.parse_qs(urlparse.urlparse(link).query,True)['id']self.formdata['captcha-solution']=captcha_solutionself.formdata['captcha-id']=captcha_idreturn[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.statusself.headers['Host']="www.douban.com"returnscrapy.Request(url='https://www.douban.com/doumail/',meta={'cookiejar':response.meta['cookiejar']},相關推薦爬蟲學習之基於 Scrapy 的爬蟲自動登入概述 在前面兩篇(爬蟲學習之基於Scrapy的網路爬蟲和爬蟲學習之簡單的網路爬蟲)文章中我們通過兩個實際的案例,採用不同的方式進行了內容提取。我們對網路爬蟲有了一個比較初級的認識,只要發起請求獲取響應的網頁內容,然後對內容進行格式化儲存。很多時候我們抓取到的內容可能會發生重複, 爬蟲學習之基於Scrapy的網路爬蟲在上一篇文章《爬蟲學習之一個簡單的網路爬蟲》中我們對爬蟲的概念有了一個初步的認識,並且通過Python的一些第三方庫很方便的提取了我們想要的內容,但是通常面對工作當作複雜的需求,如果都按照那樣的方式來處理效率非常的低,這通常需要你自己去定義並實現很多非常基礎的爬蟲框架上的功能,或者需要組合很多Python第 python3 + Scrapy爬蟲學習之創建項目set 切換 存儲 域名 arm () 打開文件 ofo 實戰 最近準備做一個關於scrapy框架的實戰,爬取騰訊社招信息並存儲,這篇博客記錄一下創建項目的步驟 pycharm是無法創建一個scrapy項目的 因此,我們需要用命令行的方法新建一個scrapy項目 請確保已經 python爬蟲學習之路-遇錯筆記-1sig packages ror caused 技術 bsp img exception mage 當在編寫爬蟲時同時開啟了Fidder解析工具時,訪問目標站點會遇到以下錯誤: File "C:\Users\litao\AppData\Local\Programs\P 爬蟲學習之-xpathpath aid ebr ast 函數文本 通過 passport attr sel 1、XPATH使用方法 使用XPATH有如下幾種方法定位元素(相比CSS選擇器,方法稍微多一點): a、通過絕對路徑定位元素(不推薦!) WebElement ele = driver 爬蟲學習之-python插入mysql報錯語句 mysql報錯 cal character 通過 tle port utf nco 異常:‘latin-1‘ codec can‘t encode characters in position 62-66: ordinal not in range(256) 用P 爬蟲學習之-返回合法文件名turn python 爬蟲學習 urn ida file 返回 pan 文件名 def validateTitle(title): rstr = r"[\/\\\:\*\?\"\<\>\|]" # ‘/ \ : * ? " < > |‘ 爬蟲學習之-文件管道重寫.org url The brush 學習 zoom 保存 raw files 如果要文件管道保存為原有的文件名 需要重寫文件管道的方法 pipeitem文件 # -*- coding: utf-8 -*- # Define your item pipelines 如何學習爬蟲,我的爬蟲學習之路,怎樣學好爬蟲的,爬蟲認知篇(1)作為一個小白來說,那就是---->我,看那多原理,等於天書,我看不懂,但是為啥是叫了解爬蟲,而不是懂裡邊內容,框架(Scrapy)怎麼寫的,我作為小白知道怎麼用,不就行了嗎,對不對,之後在瞭解深入. python爬蟲學習之爬取全國各省市縣級城市郵政編碼例項需求:運用python語言在http://www.ip138.com/post/網站爬取全國各個省市縣級城市的郵政編碼,並且儲存在excel檔案中 例項環境:python3.7 requests庫(內建的python庫,無需手動安裝) xlwt庫(需要自己手動安裝) 例項網站: Python爬蟲學習之正則表達式爬取個人博客9.png turn () htm parent ast string 則表達式 urn 實例需求:運用python語言爬取http://www.eastmountyxz.com/個人博客的基本信息,包括網頁標題,網頁所有圖片的url,網頁文章的url、標題以及摘要。 實 【Python3 爬蟲學習筆記】Scrapy框架的使用 1Scrapy功能非常強大,爬取效率高,相關擴充套件元件多,可配置和可擴充套件程度非常高,它幾乎可以應對所有發爬網站,是目前Python中使用最廣泛的爬蟲框架。 Scrapy框架介紹 Scrapy是一個基於Twisted的非同步處理框架,是純Python實現的爬蟲 python爬蟲學習之正則表示式的基本使用一、正則表示式 1. 正則表示式是字串處理的有力工具和技術。 2. 正則表示式使用某種預定義的模式去匹配一類具有共同特徵的字串,主要用於處理字串,可以快速、準確地完成複雜的查詢、替換等處理要求,在文字編輯與處理、網頁爬蟲之類的場合中有重要應用。 3. Python中,re模組提供了正則表示式操作所需 python爬蟲學習之日誌記錄模組這次的程式碼就是一個日誌記錄模組,程式碼很容易懂,註釋很詳細,也不需要安裝什麼庫。提供的功能是日誌可以顯示在螢幕上並且儲存在日誌檔案中。呼叫的方式也很簡單,測試程式碼裡面有。 原始碼: #encoding=utf-8 import logging import getpass import python學習之簡單python爬蟲參考文章來源: 基本算是第一次使用python寫程式碼,所以直接參考了已有的部落格的編寫過程。 依然遇到了問題: 問題一: urllib 和 urllib2的區別有哪些? 用urllib2獲取到網頁內容後,不能對內容進行read()操作。 但是使用urll python爬蟲學習 之 定向爬取 股票資訊一、功能描述 目標:獲取上交所和深交所所有股票的名稱和交易 資訊 輸出:儲存到檔案中 技術路線:requests-bs4-re 二、 選取原則:股票資訊靜態存在於HTML頁面中,非js程式碼生成,沒有robots協議限制 三、程式的結構設計 網頁爬蟲學習之獲取網頁中標籤內容(1)本地網頁,通過網頁中的元素進行篩選想要獲取的內容 web_parseDemo01.py from bs4 import BeautifulSoup#1、解析網頁內容,網頁的構成with open('C:/Users/GXY/PycharmProjects/untitled/homework.html python爬蟲學習之XPath基本語法XPath 使用路徑表示式來選取 XML 文件中的節點或節點集。節點是通過沿著路徑(path)或者步(steps)來選取的。 XML例項文件 我們將在下面的例子中使用這個XML文件。 <?xml version="1.0" encoding="ISO-8859-1"?> < python爬蟲學習之urllib庫urlopen get型別的網頁: import urllib.request response = urllib.request.urlopen("http://www.baidu.com") print(response.read().decode('utf-8' 爬蟲學習之17:爬取拉勾網網招聘資訊(非同步載入+Cookie模擬登陸)很多網站需要通過提交表單來進行登陸或相應的操作,可以用requests庫的POST方法,通過觀測表單原始碼和逆向工程來填寫表單獲取網頁資訊。本程式碼以獲取拉勾網Python相關招聘職位為例作為練習。開啟拉鉤網,F12進入瀏覽器開發者工具,可以發現網站使用了A |