多年開發(fā)工程師做的爬蟲筆記,抓緊時(shí)間速度收藏擒悬!

平時(shí)有個(gè)習(xí)慣模她,會(huì)把自己的筆記寫在有道云里面,現(xiàn)在做個(gè)整理懂牧。會(huì)長(zhǎng)期更新侈净,因?yàn)槲沂荁UG制造機(jī)尊勿。

解析

xpath提取所有節(jié)點(diǎn)文本

我左青龍,右白虎畜侦,
    上朱雀元扔,
  • 下玄武。
老牛在當(dāng)中旋膳,龍頭在胸口澎语。

使用xpath的string(.)

#!/usr/bin/env python

# -*- coding: utf-8 -*-

from scrapy.selector import Selector

text = '

我左青龍,右白虎验懊,
    上朱雀擅羞,
  • 下玄武。
老牛在當(dāng)中义图,龍頭在胸口减俏。
'

s = Selector(text=text)

data = s.xpath('//div[@id="test3"]')

info = data.xpath('string(.)').extract()[0]

print(info)

# output: 我左青龍,右白虎歌溉,上朱雀垄懂,下玄武。老牛在當(dāng)中痛垛,龍頭在胸口草慧。

如何解決詳情頁(yè)面元素改變

這個(gè)問(wèn)題是這樣產(chǎn)生的,在很多PC站匙头,比如鏈家漫谷,這個(gè)頁(yè)面有這些字段A,但是下個(gè)頁(yè)面這個(gè)字段A沒(méi)了蹂析,取而代之的是字段B舔示,在xpath定位時(shí)就失效了。這個(gè)問(wèn)題很常見电抚,大體思路是這樣的惕稻。

創(chuàng)建一個(gè)包含所有字段的dict: data = {}.fromkeys(('url', 'price', 'address'))

然后根據(jù)網(wǎng)頁(yè)中是否有字段來(lái)取值,例如蝙叛,有’url’就取對(duì)應(yīng)的value俺祠,沒(méi)有則為空

這樣就可以完美解決匹配不全問(wèn)題

Scrapy 相關(guān)

文件編寫

邏輯文件和解析部分分開寫,匹配文件目錄是utils/parse/借帘,爬蟲文件目錄是spiders/

Scrapy 中文亂碼

在 setting 文件中設(shè)置:FEED_EXPORT_ENCODING = 'utf-8'

Scrapy 使用Mongo

pipelines.py

首先我們要從settings文件中讀取數(shù)據(jù)的地址蜘渣、端口、數(shù)據(jù)庫(kù)名稱肺然。

拿到數(shù)據(jù)庫(kù)的基本信息后進(jìn)行連接蔫缸。

將數(shù)據(jù)寫入數(shù)據(jù)庫(kù)(update制定唯一鍵)

關(guān)閉數(shù)據(jù)庫(kù)

注意:只有打開和關(guān)閉是只執(zhí)行一次,而寫入操作會(huì)根據(jù)具體的寫入次數(shù)而定际起。

Redis 無(wú)需關(guān)閉

import pymongo

class MongoDBPipeline(object):

"""

1拾碌、連接數(shù)據(jù)庫(kù)操作

"""

def __init__(self,mongourl,mongoport,mongodb):

'''

初始化mongodb數(shù)據(jù)的url吐葱、端口號(hào)、數(shù)據(jù)庫(kù)名稱

:param mongourl:

:param mongoport:

:param mongodb:

'''

self.mongourl = mongourl

self.mongoport = mongoport

self.mongodb = mongodb

@classmethod

def from_crawler(cls,crawler):

"""

1倦沧、讀取settings里面的mongodb數(shù)據(jù)的url唇撬、port、DB展融。

:param crawler:

:return:

"""

return cls(

mongourl = crawler.settings.get("MONGO_URL"),

mongoport = crawler.settings.get("MONGO_PORT"),

mongodb = crawler.settings.get("MONGO_DB")

)

def open_spider(self,spider):

'''

1、連接mongodb數(shù)據(jù)

:param spider:

:return:

'''

self.client = pymongo.MongoClient(self.mongourl,self.mongoport)

self.db = self.client[self.mongodb]

def process_item(self,item,spider):

'''

1豫柬、將數(shù)據(jù)寫入數(shù)據(jù)庫(kù)

:param item:

:param spider:

:return:

'''

name = item.__class__.__name__

# self.db[name].insert(dict(item))

self.db['user'].update({'url_token':item['url_token']},{'$set':item},True)

return item

def close_spider(self,spider):

'''

1告希、關(guān)閉數(shù)據(jù)庫(kù)連接

:param spider:

:return:

'''

self.client.close()

scrapy圖片下載

import scrapy

from scrapy.pipelines.images import ImagesPipeline

from scrapy.exceptions import DropItem

class MyImagesPipeline(ImagesPipeline):

def get_media_requests(self, item, info):

for image_url in item['image_urls']:

yield scrapy.Request(image_url)

def item_completed(self, results, item, info):

image_paths = [x['path'] for ok, x in results if ok]

if not image_paths:

raise DropItem("Item contains no images")

item['image_paths'] = image_paths

return item

scrapy 暫停爬蟲

scrapy crawl somespider -s JOBDIR=crawls/somespider-1

scrapy_redis 分布式

使用隊(duì)列與去重即可完成分布式需求,需要注意的是 Redis 格式烧给,默認(rèn)采用的是 list燕偶, 可以在 settings.py 文件中設(shè)置 REDIS_START_URLS_AS_SET = True,使用 Redis的 set類型(去重種子鏈接)

安裝

超時(shí)問(wèn)題

自定義超時(shí)時(shí)間

sudo pip3 --default-timeout=100 install -U scrapy

或者 使用其他源

sudo pip3 install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple

權(quán)限問(wèn)題

安裝某模塊時(shí)础嫡,報(bào)錯(cuò):PermissionError: [WinError 5] 拒絕訪問(wèn)指么。: 'c:\program files\python35\Lib\sit e-packages\lxml'

最簡(jiǎn)單方法:pip install --user lxml

Pycharm 相關(guān)

.gitignore 文件

安裝插件: Preferences > Plugins > Browse repositories... > Search for ".ignore" > Install Plugin

然后就可以很方便的添加到 .gitignore

顯示函數(shù)

點(diǎn)擊 Show Members,查看目錄榴鼎,會(huì)顯示相應(yīng)的類和函數(shù)

激活碼

http://idea.liyang.io

http://xidea.online

數(shù)據(jù)

Mongo導(dǎo)出命令

λ mongoexport -d test -c set --type=csv -f name,age -o set.csv

λ mongoexport -h 10.10.10.11 -d test -c test --type=csv -f url,id,title -o data.csv

其他

requirements.txt 文件

小提示:使用 pigar 可以一鍵生成 requirements.txt 文件

Installation:pip install pigar

Usage:pigar

好了伯诬,今天先寫這點(diǎn),以后再補(bǔ)上巫财。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盗似,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子平项,更是在濱河造成了極大的恐慌赫舒,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闽瓢,死亡現(xiàn)場(chǎng)離奇詭異接癌,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)扣讼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門缺猛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人届谈,你說(shuō)我怎么就攤上這事枯夜。” “怎么了艰山?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵湖雹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我曙搬,道長(zhǎng)摔吏,這世上最難降的妖魔是什么鸽嫂? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮征讲,結(jié)果婚禮上据某,老公的妹妹穿的比我還像新娘。我一直安慰自己诗箍,他們只是感情好癣籽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著滤祖,像睡著了一般筷狼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匠童,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天埂材,我揣著相機(jī)與錄音,去河邊找鬼汤求。 笑死俏险,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扬绪。 我是一名探鬼主播竖独,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼勒奇!你這毒婦竟也來(lái)了预鬓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赊颠,失蹤者是張志新(化名)和其女友劉穎格二,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竣蹦,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡顶猜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痘括。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片长窄。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖纲菌,靈堂內(nèi)的尸體忽然破棺而出挠日,到底是詐尸還是另有隱情,我是刑警寧澤翰舌,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布嚣潜,位于F島的核電站,受9級(jí)特大地震影響椅贱,放射性物質(zhì)發(fā)生泄漏懂算。R本人自食惡果不足惜只冻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望计技。 院中可真熱鬧喜德,春花似錦、人聲如沸垮媒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)睡雇。三九已至贱呐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間入桂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工驳阎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抗愁,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓呵晚,卻偏偏與公主長(zhǎng)得像蜘腌,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饵隙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • Scrapy撮珠,Python開發(fā)的一個(gè)快速,高層次的屏幕抓取和web抓取框架,用于抓取web站點(diǎn)并從頁(yè)面中提取結(jié)構(gòu)化...
    Evtion閱讀 5,852評(píng)論 12 18
  • scrapy學(xué)習(xí)筆記(有示例版) 我的博客 scrapy學(xué)習(xí)筆記1.使用scrapy1.1創(chuàng)建工程1.2創(chuàng)建爬蟲模...
    陳思煜閱讀 12,701評(píng)論 4 46
  • scrapy源碼https://github.com/scrapy/scrapy/tree/master/scra...
    木魚非魚閱讀 830評(píng)論 0 1
  • 1. 過(guò)年也沒(méi)啥事干金矛,繼續(xù)搗鼓爬蟲芯急。開始是準(zhǔn)備爬豆瓣電影的,豆瓣存在一些反爬機(jī)制驶俊,爬一會(huì)就爬不動(dòng)了娶耍。當(dāng)然后面是突破...
    無(wú)事扯淡閱讀 2,041評(píng)論 0 13
  • 這些組件最重要的思路就是攔截,即過(guò)濾 item管道:作用一:入庫(kù) 校驗(yàn):一是可以在管道饼酿,但主要是在item定義字段...
    慫恿的大腦閱讀 1,053評(píng)論 0 0