zoukankan      html  css  js  c++  java
  • 爬取起点小说网(三)遇到的问题和代码解析

    爬取起点小说网运用到的知识:
    (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脚本渲染出来的
    *丢数据问题,当每次爬取小说分类下的小说名和连接,少量没事,大量的话,每次爬取的数目都不一样,或多或少,有丢失
    *















  • 相关阅读:
    HDU 1556 Color the ball【树状数组】
    HDU 3015 Disharmony Trees 【 树状数组 】
    POJ 1990 MooFest【 树状数组 】
    codeforces 493 C Vasya and Basketball
    12、Decorator 装饰器 模式 装饰起来美美哒 结构型设计模式
    11、Composite 组合模式 容器与内容的一致性(抽象化) 结构型设计模式
    10、Strategy 策略模式 整体地替换算法 行为型模式
    9、Bridge 桥梁模式 将类的功能层次结构与实现层结构分离 结构型设计模式
    读源码从简单的集合类之ArrayList源码分析。正确认识ArrayList
    8、Builder 建造者模式 组装复杂的实例 创造型模式
  • 原文地址:https://www.cnblogs.com/yongxinboy/p/8029134.html
Copyright © 2011-2022 走看看