0

0

Scrapy教程--某网站前N篇文章抓取

巴扎黑

巴扎黑

发布时间:2017-06-23 15:47:14

|

1783人浏览过

|

来源于php中文网

原创

一、前3000名人员列表页

   2)分析页面结构:每一个td都是,一个人员。

      第一个small为排名

      第二个a标签是昵称和用户名,以及首页的博客地址。用户名通过地址截取获取

      第四个small标签是,博客数量以及积分,通过字符串分离后可以逐个获取到。

  3)代码:使用xpath获取标签及相关的内容,获取到首页博客地址后,发送请求。

def parse(self, response):
       for i in response.xpath("//table[@width='90%']//td"):
           item = CnblogsItem()
           item['top'] = i.xpath(
               "./small[1]/text()").extract()[0].split('.')[-2].strip()
           item['nickName'] = i.xpath("./a[1]//text()").extract()[0].strip()
           item['userName'] = i.xpath(
               "./a[1]/@href").extract()[0].split('/')[-2].strip()
           totalAndScore = i.xpath(
               "./small[2]//text()").extract()[0].lstrip('(').rstrip(')').split(',')
           item['score'] = totalAndScore[2].strip()
#             print(top)
#             print(nickName)
#             print(userName)
#             print(total)
#             print(score)
#             return
           yield scrapy.Request(i.xpath("./a[1]/@href").extract()[0], meta={'page': 1, 'item': item},
                                callback=self.parse_page)

二、各人员博客列表页

  1)页面结构:通过分析,每篇博客的a标签id中都包含“TitleUrl”,这样就可以获取到每篇博客的地址了。每页面地址,加上default.html?page=2,page跟着变动就可以了。

  2)代码:置顶的文字会去除掉。

def parse_page(self, response):
       #         print(response.meta['nickName'])
       #//a[contains(@id,'TitleUrl')]
       urlArr = response.url.split('default.aspx?')
       if len(urlArr) > 1:
           baseUrl = urlArr[-2]
       else:
           baseUrl = response.url
       list = response.xpath("//a[contains(@id,'TitleUrl')]")
       for i in list:
           item = CnblogsItem()
           item['top'] = int(response.meta['item']['top'])
           item['nickName'] = response.meta['item']['nickName']
           item['userName'] = response.meta['item']['userName']
           item['score'] = int(response.meta['item']['score'])
           item['pageLink'] = response.url
           item['title'] = i.xpath(
               "./text()").extract()[0].replace(u'[置顶]', '').replace('[Top]', '').strip()
           item['articleLink'] = i.xpath("./@href").extract()[0]
           yield scrapy.Request(i.xpath("./@href").extract()[0], meta={'item': item}, callback=self.parse_content)
       if len(list) > 0:
           response.meta['page'] += 1
           yield scrapy.Request(baseUrl + 'default.aspx?page=' + str(response.meta['page']), meta={'page': response.meta['page'], 'item': response.meta['item']}, callback=self.parse_page)

   3)对于每篇博客的内容,这里没有抓取。也很简单,分析页面。继续发送请求,找到id为cnblogs_post_body的div就可以了。

剪刀手
剪刀手

全自动AI剪辑神器:日剪千条AI原创视频,零非原创风险,批量高效制作引爆流量!免费体验,轻松上手!

下载
def parse_content(self, response):
        content = response.xpath("//div[@id='cnblogs_post_body']").extract()
        item = response.meta['item']if len(content) == 0:
            item['content'] = u'该文章已加密'else:
            item['content'] = content[0]yield item

三、数据存储MongoDB

  这一部分没什么难的。记着安装pymongo,pip install pymongo。总共有80+万篇文章。

from cnblogs.items import CnblogsItemimport pymongoclass CnblogsPipeline(object):def __init__(self):
        client = pymongo.MongoClient(host='127.0.0.1', port=27017)
        dbName = client['cnblogs']
        self.table = dbName['articles']
        self.table.createdef process_item(self, item, spider):if isinstance(item, CnblogsItem):
            self.table.insert(dict(item))return item

四、代理及Model类

  scrapy中的代理,很简单,自定义一个下载中间件,指定一下代理ip和端口就可以了。

def process_request(self, request, spider):
        request.meta['proxy'] = 'http://117.143.109.173:80'

  Model类,存放的是对应的字段。

class CnblogsItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()# 排名top = scrapy.Field()
    nickName = scrapy.Field()
    userName = scrapy.Field()# 积分score = scrapy.Field()# 所在页码地址pageLink = scrapy.Field()# 文章标题title = scrapy.Field()# 文章链接articleLink = scrapy.Field()

    # 文章内容
       content = scrapy.Field()

五、wordcloud词云分析

  对每个人的文章进行词云分析,存储为图片。wordcloud的使用用,可参考园内文章。

  这里用了多线程,一个线程用来生成分词好的txt文本,一个线程用来生成词云图片。生成词云大概,1秒一个。

# coding=utf-8import sysimport jiebafrom wordcloud import WordCloudimport pymongoimport threadingfrom Queue import Queueimport datetimeimport os
reload(sys)
sys.setdefaultencoding('utf-8')class MyThread(threading.Thread):def __init__(self, func, args):
        threading.Thread.__init__(self)
        self.func = func
        self.args = argsdef run(self):
        apply(self.func, self.args)# 获取内容 线程def getTitle(queue, table):for j in range(1, 3001):#         start = datetime.datetime.now()list = table.find({'top': j}, {'title': 1, 'top': 1, 'nickName': 1})if list.count() == 0:continuetxt = ''for i in list:
            txt += str(i['title']) + '
'name = i['nickName']
            top = i['top']
        txt = ' '.join(jieba.cut(txt))
        queue.put((txt, name, top), 1)#         print((datetime.datetime.now() - start).seconds)def getImg(queue, word):for i in range(1, 3001):#         start = datetime.datetime.now()get = queue.get(1)
        word.generate(get[0])
        name = get[1].replace('<', '').replace('>', '').replace('/', '').replace('\', '').replace('|', '').replace(':', '').replace('"', '').replace('*', '').replace('?', '')
        word.to_file('wordcloudimgs/' + str(get[2]) + '-' + str(name).decode('utf-8') + '.jpg')print(str(get[1]).decode('utf-8') + '	生成成功')#         print((datetime.datetime.now() - start).seconds)def main():
    client = pymongo.MongoClient(host='127.0.0.1', port=27017)
    dbName = client['cnblogs']
    table = dbName['articles']
    wc = WordCloud(
        font_path='msyh.ttc', background_color='#ccc', width=600, height=600)if not os.path.exists('wordcloudimgs'):
        os.mkdir('wordcloudimgs')
    threads = []
    queue = Queue()
    titleThread = MyThread(getTitle, (queue, table))
    imgThread = MyThread(getImg, (queue, wc))
    threads.append(imgThread)
    threads.append(titleThread)for t in threads:
        t.start()for t in threads:
        t.join()if __name__ == "__main__":
    main()

六、完整源码地址

  

 

附:mongodb内存限制windows:

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

705

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

233

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

117

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

22

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

61

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

30

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

669

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

58

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python Scrapy 网络爬虫实战视频教程
Python Scrapy 网络爬虫实战视频教程

共16课时 | 5.5万人学习

Python 3 教程
Python 3 教程

共35课时 | 30.1万人学习

Rust 教程
Rust 教程

共28课时 | 6.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号