現在的大**基本除了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的安裝是比較常見的,相對其他兩種...