平時(shí)有個(gè)習(xí)慣模她,會(huì)把自己的筆記寫在有道云里面,現(xiàn)在做個(gè)整理懂牧。會(huì)長(zhǎng)期更新侈净,因?yàn)槲沂荁UG制造機(jī)尊勿。
解析
xpath提取所有節(jié)點(diǎn)文本
- 上朱雀元扔,
- 下玄武。
使用xpath的string(.)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from scrapy.selector import Selector
text = '
- 上朱雀擅羞,
- 下玄武。
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ǔ)上巫财。