爬取起點小說網(三)遇到的問題和代碼解析

爬取起點小說網運用到的知識:
(1)redis,mongdb,的鏈接,刪查,mongdb更新等;
(2)scrapy框架的基本格式,
class qidianNovelSpider(scrapy.Spider):
name = "qidianNovel" #執行文件名
allowed_domains = ["qidian.com"] # 容許訪問的域redis

def __init__(self): #構造方法
scrapy框架的select選擇器;
hxs = HtmlXPathSelector(response)
hxsObj = hxs.select('//div[@class="work-filter type-filter"]/ul[@type="category"]/li[@class=""]/a')
for secItem in hxsObj:
className = secItem.select('text()').extract()
classUrl = secItem.select('@href').extract()
classUrl = 'https:' + classUrl[0]
print(className[0])
print(classUrl)
(3)字典{}
(4)scrapy的callback中使用lambda小結:
用lambda定義函數 的用法其實很簡單: lambda [參數部分] : [函數部分]
先舉一個簡單的例子
func = lambda x,y : x+y
func(3,5)
那麼顯而易見結果是8

request = Request(classUrl, callback=lambda response, pid=str(classid): self.parse_subClass(response, pid))
yield request
(5)yield起暫停效果,循環一次,調用一次(發現的問題只能爬兩級)
eg:
(6)字符串拼串:
classUrl2 = 'https:' + classUrl2[0]
print(classUrl2)
(7)插庫操做封裝成方法:
def insertMongo(self, classname, pid):
classid = collection.insert({'classname': classname, 'pid': pid})
return classid數據庫

def pushRedis(self, classid, pid, url):
novelurl = '%s,%s,%s' % (classid, pid, url)
r.lpush('novelurl', novelurl)
調用方法:
classid = self.insertMongo(className2[0], pid)
self.pushRedis(classid, pid, classUrl2)
(8)鏈接數據庫:
鏈接redis數據庫:
import redis # 導入redis數據庫
r = redis.Redis(host='127.0.0.1', port=6379, db=0)
鏈接mongdb數據庫:
import pymongo框架

client = pymongo.MongoClient(host="127.0.0.1")
db = client.novel # 庫名dianping
collection = db.novelname#表名
(9)讀取redis數據庫:
urlList = r.lrange('novelurl', 0, -1)

(10)只從庫中取三個鏈接的方法:
定義一個變量,ii=0;當ii大於3中止
ii += 1
if ii > 3:
break
(11)獲取下一頁鏈接的方法:基本通用
def nextUrl(self, response):
hxs = HtmlXPathSelector(response)
# nextPage = hxs.select('//li[@class="lbf-pagination-item"]/a[@class="lbf-pagination-next "]')
nextPage = hxs.select('//a[@class="lbf-pagination-next "]')
# print(nextPage.extract())
if len(nextPage) == 1:#判斷下一頁鏈接是否爲空,不爲空繼續執行
nextPage = nextPage.select('@href').extract()
nextPage = "https:" + nextPage[0]dom

print('==============' + nextPage + '====================')
return nextPage
(12)遇到的問題:
*定義我只爬取三頁的方法:
*難點把所要爬取的鏈接的流水id,賦值給爬取內容的存入庫中的pid
*把獲取到的數據更新到原有的庫中的表中
*小說內容沒法打開原網頁查看源代碼,fn+F12檢查查看源代碼
*小說網站下一頁鏈接,或其餘鏈接不是鏈接,是js腳本渲染出來的
*丟數據問題,當每次爬取小說分類下的小說名和鏈接,少許沒事,大量的話,每次爬取的數目都不同,或多或少,有丟失
*















scrapy

相關文章
相關標籤/搜索