当前位置: 首页 > news >正文

Python爬虫入门教程 40-100 博客园Python相关40W博客抓取 scrapy

爬前叨叨

第40篇博客吹响号角,爬取博客园博客~本文最终抓取到了从2010年1月1日到2019年1月7日的37W+文章,后面可以分析好多东西了呢

经常看博客的同志知道,博客园每个栏目下面有200页,多了的数据他就不显示了,最多显示4000篇博客如何尽可能多的得到博客数据,是这篇文章研究的一点点核心内容,能√get到多少就看你的了~

单纯的从每个栏目去爬取是不显示的,转换一下思路,看到搜索页面,有时间~,有时间!

注意看URL链接

https://zzk.cnblogs.com/s/blogpost?Keywords=python&datetimerange=Customer&from=2019-01-01&to=2019-01-01  
复制代码

这个链接得到之后,其实用一个比较简单的思路就可以获取到所有python相关的文章了,迭代时间。 下面编写核心代码,比较重要的几个点,我单独提炼出来。

  1. 页面搜索的时候因为加了验证,所以你必须要获取到你本地的cookie,这个你很容易得到
  2. 字典生成器的语法是时候去复习一下了
import scrapy
from scrapy import Request,Selector
import time
import datetime

class BlogsSpider(scrapy.Spider):
    name = 'Blogs'
    allowed_domains = ['zzk.cnblogs.com']
    start_urls = ['http://zzk.cnblogs.com/']
    from_time = "2010-01-01"
    end_time = "2010-01-01"
    keywords = "python"
    page =1
    url = "https://zzk.cnblogs.com/s/blogpost?Keywords={keywords}&datetimerange=Customer&from={from_time}&to={end_time}&pageindex={page}"
    custom_settings = {
        "DEFAULT_REQUEST_HEADERS":{
            "HOST":"zzk.cnblogs.com",
            "TE":"Trailers",
            "referer": "https://zzk.cnblogs.com/s/blogpost?w=python",
            "upgrade-insecure-requests": "1",
            "user-agent": "Mozilla/5.0 Gecko/20100101 Firefox/64.0"

        }
    }


    def start_requests(self):
        cookie_str = "想办法自己获取到"
        self.cookies = {item.split("=")[0]: item.split("=")[1] for item in cookie_str.split("; ")}
        yield Request(self.url.format(keywords=self.keywords,from_time=self.from_time,end_time=self.end_time,page=self.page),cookies=self.cookies,callback=self.parse)

复制代码

页面爬取完毕之后,需要进行解析,获取翻页页码,同时将时间+1天,下面的代码重点看时间叠加部分的操作。

    def parse(self, response):
        print("正在爬取",response.url)
        count = int(response.css('#CountOfResults::text').extract_first()) # 获取是否有数据
        if count>0:
            for page in range(1,int(count/10)+2):
                # 抓取详细数据
                yield Request(self.url.format(keywords=self.keywords,from_time=self.from_time,end_time=self.end_time,page=page),cookies=self.cookies,callback=self.parse_detail,dont_filter=True)

        time.sleep(2)
        # 跳转下一个日期
        d = datetime.datetime.strptime(self.from_time, '%Y-%m-%d')
        delta = datetime.timedelta(days=1)
        d = d + delta
        self.from_time = d.strftime('%Y-%m-%d')
        self.end_time =self.from_time
        yield Request(
            self.url.format(keywords=self.keywords, from_time=self.from_time, end_time=self.end_time, page=self.page),
            cookies=self.cookies, callback=self.parse, dont_filter=True)
复制代码

页面解析入库

本部分操作逻辑没有复杂点,只需要按照流程编写即可,运行代码,跑起来,在mongodb等待一些时间

db.getCollection('dict').count({}) 
复制代码

返回

372352条数据
复制代码

    def parse_detail(self,response):
        items = response.xpath('//div[@class="searchItem"]')
        for item in items:
            title = item.xpath('h3[@class="searchItemTitle"]/a//text()').extract()
            title = "".join(title)

            author = item.xpath(".//span[@class='searchItemInfo-userName']/a/text()").extract_first()
            public_date = item.xpath(".//span[@class='searchItemInfo-publishDate']/text()").extract_first()
            pv = item.xpath(".//span[@class='searchItemInfo-views']/text()").extract_first()
            if pv:
                pv = pv[3:-1]
            url = item.xpath(".//span[@class='searchURL']/text()").extract_first()
            #print(title,author,public_date,pv)
            yield {
                "title":title,
                "author":author,
                "public_date":public_date,
                "pv":pv,
                "url":url
            }

复制代码

数据入库

一顿操作猛如虎,数据就到手了~后面可以做一些简单的数据分析,那篇博客再见啦@

相关文章:

  • Druid 在有赞的实践
  • SpiderData 2019年2月25日 DApp数据排行榜
  • 如何免费的让网站启用https
  • request和response
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • CAP 一致性协议及应用解析
  • asp.net core系列 32 EF查询数据 必备知识(1)
  • css选择器
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 如何更有效的消灭watchdogs挖矿病毒?华为云DCS Redis为您支招
  • 译有关态射的一切
  • java注解的概念理解
  • 详解NodeJs流之一
  • 智能驾驶正文 0 戴姆勒与宝马抱团开发自动驾驶 新旧车企大战在即
  • 数据建模的三种分类(来自Enterprise Architect的文档)
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • js操作时间(持续更新)
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • php中curl和soap方式请求服务超时问题
  • Promise面试题2实现异步串行执行
  • Python进阶细节
  • 编写高质量JavaScript代码之并发
  • 基于组件的设计工作流与界面抽象
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 聊聊sentinel的DegradeSlot
  • 前端技术周刊 2019-01-14:客户端存储
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 听说你叫Java(二)–Servlet请求
  • 小程序01:wepy框架整合iview webapp UI
  • 优化 Vue 项目编译文件大小
  • ionic异常记录
  • Spring第一个helloWorld
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 移动端高清、多屏适配方案
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #QT(一种朴素的计算器实现方法)
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)ABI是什么
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • **python多态
  • *2 echo、printf、mkdir命令的应用
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET处理HTTP请求
  • .Net中wcf服务生成及调用
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • @GetMapping和@RequestMapping的区别
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @Valid和@NotNull字段校验使用
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解