網頁爬蟲 scrapy高階

2021-08-09 08:29:53 字數 4229 閱讀 2672

現在的大**基本除了pc端都會有移動端,所以需要先確定爬哪個。

www.weibo.com,主站

www.weibo.cn,簡化版

m.weibo.cn,移動版

上面三個中,主站的微博資料是動態載入的,意味著光看原始碼是看不到資料的,想爬的話要麼搞清楚其api訪問情況,要麼模擬js,那樣的話花的力氣可能就有點多了。weibo.cn是乙個簡化版,資料能直接從網頁源**中解析出來,但使用正則或xpath取網頁中的元素仍然是無聊且費時的,更不用說偶爾的頁面結構錯誤更讓人抓狂。 相比之下,移動版的爬蟲最好寫,因為移動版能直接拿到json格式的資料。

一般來說,有移動版的**優先爬移動版,會節省很多力氣。

現在需要登入才能正常瀏覽的**的越來越多了,對爬蟲也越來越不友好...所以模擬登入在不少場合都是必不可少的。

首先,最簡單的模擬登入是只有使用者名稱密碼的登入。這時候只需要在傳送第乙個請求時加上登入表單資料即可:

def

start_requests

(self):

return scrapy.formrequest(

formdata=,

callback=self.after_login

)

如果不知道登入頁面是哪乙個的話,也可以在返回第乙個請求後登入:

def

parse

(self, response):

return scrapy.formrequest.from_response(

response,

formdata=,

callback=self.after_login

)

為了保持登入,注意cookie是不能關閉的(預設情況是開著的,可以在settings.py中設定)。

如果需要驗證碼的話,網上有一些提取分析驗證碼的包,可以提取出來然後手動輸入驗證碼。

那麼,如何獲得cookie呢?有chrome的可以f12開啟network介面,這時候人工網頁登入,即可在headers中看到cookie。得到cookie後,只需要在request中加入自己的cookie即可。

self.cookie = 

return

request(url, cookies=self.cookie, callback=self.parse_page)

一般來說,使用xpath和css已經可以應付所有的html原始碼了,剩下的只是耐心加細心...要是有心的話也可以item loaders,方便後期的維護,下面摘自官方文件:

def

parse

(self, response):

l = itemloader(item=product(), response=response)

l.add_xpath('name', '//div[@class="product_name"]')

l.add_xpath('name', '//div[@class="product_title"]')

l.add_xpath('price', '//p[@id="price"]')

l.add_css('stock', 'p#stock]')

l.add_value('last_updated', 'today')

return l.load_item()

值得一提的是如果獲取的是json格式的資料,可以使用python自帶的json庫來解析成乙個字典或列表:

data = json.loads(response.body)
可以使用twisted提供的資料庫庫來維護乙個連線池:

class

cnblogpipeline

(object):

def__init__

(self):

self.dbpool = adbapi.connectionpool('mysqldb',

host='localhost',

db='cnblog',

user='root',

passwd='root',

cursorclass=mysqldb.cursors.dictcursor,

charset='utf8',

use_unicode=true)

defprocess_item

(self, item, spider):

self.dbpool.runinteraction(self.cnblog_insert, item)

return item

defcnblog_insert

(self, cur, item):

try:

cur.execute('insert into ***')

exception mysqldb.error, e:

logging.info("cnblog_insert:%s" % str(e))

如果爬的是社交**這種有著樹型結構關係的**的話,mongodb其符合人的思維的儲存方式讓其成為首選。

如果使用mysql的話記得將innodb_flush_log_at_trx_commit這個引數置為0(每一秒讀寫一次資料和log),可以大大提高讀寫速度。

request(url, meta=, callback=self.parse_page)

defparse_page

(self, response):

print response.meta['how']

class

cnblogspider

(crawlspider):

name = "cnblog_spider"

allowed_domain = ["cnblog.com"]

start_urls = [""]

rules = [

rule(linkextractor(allow=r"/p/\d+\.html"),

callback="parse_page", follow=true)

]

def

parse_page

(self, response):

item = cnblogitem()

****

yield item

yield request(new_url, callback=self.parse_page)

custom_settings=

}

class

mongopipeline

(object):

def__init__

(self, mongo_uri, mongo_db):

self.mongo_uri = mongo_uri

@classmethod

deffrom_crawler

(cls, crawler):

return cls(

mongo_uri=crawler.settings.get('mongo_uri')

)

**********_middlewares =
def

process_item

(self, item, spider):

if spider.name == 'a':

****

if spider.name == 'b':

****

def

process_item

(self, item, spider):

return item

scrapy_redis是乙個分布式爬蟲的解決方案。其思想為多個爬蟲共用乙個爬取佇列,此佇列使用redis儲存,因為redis是乙個記憶體資料庫,所以速度上與單機的佇列相差不大。

那麼,scrapy_redis到底對scrapy做了什麼修改,達到分布式的目的呢?

檢視github上面的原始碼,可以發現其功能性**集中在scheduler.py,dupefilter.py和queue.py中,分別是排程器(部分功能),去重,以及redis佇列的實現。scrapy_redis就是將這些功能代替了scrapy原本的功能(並沒有修改scrapy原始碼,只需要在settings.py中進行設定即可),從而達到了分布式的效果。

高階爬蟲Scrapy框架

記錄下容易出錯的地方 from movie.items import movieitem 資料夾.檔名 引入 類名 import scrapy from items import movieitem class shuichanspider scrapy.spider name shuichan a...

Python高階爬蟲框架Scrapy簡介

scrapy 框架 scrapy是用純python實現乙個為了爬取 資料 提取結構性資料而編寫的應用框架,用途非常廣泛。框架的力量,使用者只需要定製開發幾個模組就可以輕鬆的實現乙個爬蟲,用來抓取網頁內容以及各種,非常之方便。scrapy架構圖 綠線是資料流向 95625f65089e4bc98a26...

python的高階爬蟲框架Scrapy

眾所周知,scrapy 是乙個高階的python爬蟲框架,功能極其強大,擁有它就可以快速編寫出乙個爬蟲專案,擁有它就可以搭建分布式架構。那麼,請問這麼強大的框架要怎麼擁有?很簡單,由於我只嘗試了windows平台下的安裝,所以下文也是該平台下的安裝步驟。windows的安裝是比較常見的,相對其他兩種...