爬取起点小说网(三)遇到的问题和代码解析

爬取起点小说网运用到的知识:
(1)redis,mongdb,的连接,删查,mongdb更新等;
(2)scrapy框架的基本格式,
class qidianNovelSpider(scrapy.Spider):
name = "qidianNovel" #执行文件名
allowed_domains = ["qidian.com"] # 允许访问的域

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]

print('==============' + nextPage + '====================')
return nextPage
(12)遇到的问题:
*定义我只爬取三页的方法:
*难点把所要爬取的连接的流水id,赋值给爬取内容的存入库中的pid
*把获取到的数据更新到原有的库中的表中
*小说内容无法打开原网页查看源代码,fn+F12检查查看源代码
*小说网站下一页连接,或其他连接不是连接,是js脚本渲染出来的
*丢数据问题,当每次爬取小说分类下的小说名和连接,少量没事,大量的话,每次爬取的数目都不一样,或多或少,有丢失
*















原文地址:https://www.cnblogs.com/yongxinboy/p/8029134.html