首先声明,在Python和爬虫这方面,我是业余的那一卦,只是平时玩一玩,不能当真的,请各位大佬轻拍。虽然爬虫与传统意义上的大数据技术不属于同一类,但大概也只能放在大数据分类下面了。
今天接到了 @小阿妩 的一个需求(她是做产品经理的,也只有“需求”这个词最合适了)。大意是因为担心QQ群空间不稳定或者关闭,因此需要备份某个QQ群空间的所有帖子。帖子量比较大,有几千条,人工操作会很麻烦,才会想到用爬虫来解决问题。
事不宜迟,下班之后马上用Scrapy来搞一波。由于日更的时间快到了,因此下面写得有点简略,之后再来慢慢充实内容吧。

安装Scrapy

我之前就已经装过了,按照官方文档http://doc.scrapy.org/en/latest/intro/install.html的介绍来,基本就可以万无一失。中途可能需要解决一下个别组件的依赖版本问题,比如six、Twisted、pyOpenSSL。另外我用的Python版本是2.7.10。
从官方的架构说明文档http://doc.scrapy.org/en/latest/topics/architecture.html中盗一张图来看Scrapy的运行机制,不多废话了。

image

创建Scrapy项目

终端执行scrapy startproject qq_qgc_spider,然后打开PyCharm导入项目即可。

分析页面结构

Chrome的“审查元素”功能派上用场了,还能一键导出XPath。贴张图感受一下。

image

保持登录状态

本来是想采用模拟登录的方法的,但是QQ群空间的网页版登录窗口在Chrome下显示不全,没有账号密码登录的选项,并且也没有单独的移动版页面,就只能采用提取Cookies的方法了。详情还是看图。

image

在settings.py中,加入默认请求headers,同时把COOKIES_ENABLED设为False,这样才会使用headers中定义的cookie。

# Disable cookies (enabled by default)
COOKIES_ENABLED = False# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encoding': 'gzip, deflate','Accept-Language': 'en,zh-CN;q=0.9,zh;q=0.8,ja;q=0.7,es;q=0.6','Cache-Control': 'max-age=0','Connection': 'keep-alive','Cookie': 'pgv_pvi=2645434368; RK=XGpQSgnlP6; ptcz=db5efe1457bcd4488f4edc672e564bbc4343ba3b8330faed74e74bbc3c1545a1; pgv_pvid=484757304; o_cookie=305546990; pac_uid=1_305546990; luin=o0305546990;******************************************* ; uniqueuid=f79135c957a48801cf1a97a7667dc22f','Host': 'qgc.qq.com','Upgrade-Insecure-Requests': '1'
}

定义爬取数据结构

只需要帖子ID、标题、内容三项,所以items.py中这样写。

from scrapy import Field, Itemclass QgcTopicItem(Item):# define the fields for your item here like:# name = scrapy.Field()topic_id = Field()title = Field()content = Field()pass

编写爬虫主程序

没有用BeautifulSoup和Selenium等爬虫工程中常用的库。一是它们的效率都不算很高;二是数据规模比较小,直接基于Scrapy的Selector+XPath做解析就行。
逻辑比较简单,帖子列表+帖子详情,典型的两级爬取结构。唯一特别要注意的是“下一页”逻辑的递归调用,另外meta可以用来方便传参。

#!/usr/bin/python
# -*- coding: utf-8 -*-from scrapy import Spider
from scrapy.http import Request
from scrapy.selector import Selector
from qq_qgc_spider.items import *QGC_ADDRESS = 'http://qgc.qq.com'
QQ_GROUP_ID = '89753069'class QgcSpider(Spider):name = 'QgcSpider'allowed_domains = ['qq.com']start_urls = ['%s/%s?page=1' % (QGC_ADDRESS, QQ_GROUP_ID)]def parse(self, response):for url in self.start_urls:yield Request(url, self.parse_topic_list)def parse_topic_list(self, response):selector = Selector(response)a_links_titles = selector.xpath('//div[@id="threadlist"]/div[@class="feed clearfix"]/dl/dt/a')for a_link_title in a_links_titles:link = a_link_title.xpath('./@href').extract_first()title = a_link_title.xpath('./@title').extract_first()detail_request = Request(QGC_ADDRESS + link + '?hostOnly=1', self.parse_topic_detail)detail_request.meta['topic_id'] = link.split('/')[3]detail_request.meta['title'] = titleyield detail_requesta_page_numbers = selector.xpath('//div[@id="threadlist"]/div[@class="page"]/p/a')for a_page_no in a_page_numbers:span_no = a_page_no.xpath('./span/text()').extract_first()if span_no == u'下一页':link = a_page_no.xpath('./@href').extract_first()yield Request(QGC_ADDRESS + link, self.parse_topic_list)def parse_topic_detail(self, response):selector = Selector(response)content = ''div_contents = selector.xpath('//td[@id="plc_0"]/div[@class="pct xs2"]/div[@class="pctmessage mbm"]/div')for div_content in div_contents:div_paragraphs = div_content.xpath('./div//text()')for para in div_paragraphs.extract():content += (para + '\r\n')item = QgcTopicItem()item['topic_id'] = response.meta['topic_id']item['title'] = response.meta['title']item['content'] = contentyield item

UA伪造和AutoThrottle

说到底都是为了防止被封。UA伪造可以使用fake_useragent库来实现。在middlewares.py中定义一个下载中间件。

class FakeUAMiddleware(object):def __init__(self, crawler):super(FakeUAMiddleware, self).__init__()self.ua = UserAgent()self.ua_type = crawler.settings.get('UA_TYPE', 'random')@classmethoddef from_crawler(cls, crawler):return cls(crawler)def process_request(self, request, spider):fake_ua = getattr(self.ua, self.ua_type)request.headers.setdefault('User-Agent', fake_ua)

然后在settings.py中启用之。顺便还有AutoThrottle的设定,这样就不会跑得太快了。

DOWNLOADER_MIDDLEWARES = {'qq_qgc_spider.middlewares.FakeUAMiddleware': 543,'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None
}
# Enable and configure the AutoThrottle extension (disabled by default)
# See https://doc.scrapy.org/en/latest/topics/autothrottle.html
AUTOTHROTTLE_ENABLED = True
# The initial download delay
AUTOTHROTTLE_START_DELAY = 10
# The maximum download delay to be set in case of high latencies
AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0

将爬取结果保存到txt文件

用Scrapy的流水线来实现,每个帖子保存一个txt,并且采用GB18030编码,更平易近人一些。pipelines.py中加入:

import codecs
import sysreload(sys)
sys.setdefaultencoding('utf-8')class TextFilePipeline(object):def __init__(self):self.path = '/Users/lmagic/Documents/bsm_plays_backup/'def process_item(self, item, spider):file_name = '%s - %s.txt' % (item['topic_id'], item['title'])content = '%s\r\n\r\n%s'.decode('utf-8').encode('gb18030') % (item['title'], item['content'])fd = codecs.open(self.path + file_name, 'w+', encoding='gb18030')fd.write(content)fd.close()

settings.py中:

ITEM_PIPELINES = {'qq_qgc_spider.pipelines.TextFilePipeline': 300# 'qq_qgc_spider.pipelines.QgcSpiderPipeline': 300,
}

跑起来吧

from scrapy import cmdlinecmdline.execute("scrapy crawl QgcSpider".split())

然后去输出路径下收结果就好了~


http://www.taodudu.cc/news/show-5542223.html

相关文章:

  • Linux服务器管理日记分享
  • 解读:【美团】智能客服实践
  • 2020.12.21-12.28 人工智能行业每周技术动态
  • [“空头计划“第二期 ] QQ机器人(Python ^3.7 + 机器人框架NoneBot-beta2最新版本)实现
  • 基于CF(协同过滤)推荐算法
  • 如何在同一IP号不同端口的服务器之间复制文件
  • springboot 同一服务器运行同一服务session冲突问题处理
  • 宝塔网站迁移
  • 同一服务器不同应用cookie互相影响问题
  • nginx+docker同一服务器上部署多个docker实现负载均衡
  • 企业网络-AD服务器DNS基础安装
  • 【nginx反向代理】映射同一服务器上的多个端口
  • 宝塔面板在同一服务器下创建多个端口部署项目(轻量应用服务器一键部署网站、博客、GltLab完整版)
  • Elo系统---英雄联盟、WOW采用的匹配算法
  • 某腾LOL开发负责人教你如何用Java实现一把 LOL 案例,学会模板设计模式!
  • java 爱情程序_Java的爱情:巩固控制和循环语句
  • 腾讯健康 养生 身体 心理 私密 话题 名医堂 图片 生活保健 搜狗 女人过瘦10大坏处:易造成贫血脱发甚至不孕...
  • 《传统文化与中医养生》笔记
  • 叮当快药:8090后养生报告
  • 健康知识,日常生活健康大全
  • 养生《一》
  • 【养生保健:脂肪肝发生前的七种征兆】
  • 养生保健的误区有哪些?
  • 金优商城教你识别24个坑人的“养生常识”!
  • 教你处理身体的小问题日常养生保健
  • 记一次养生课笔记——养生保健:你是哪种体质?
  • 《保健养生》---保健专家齐国力[1]
  • 电脑族养生保健三步走 熬夜加班无伤害
  • 【女性养生】十大原因让女人老得快
  • 夏季养生保健 10个常识女人夏季养生必备

使用Python+Scrapy爬取并保存QQ群空间帖子相关推荐

  1. Python scrapy爬取京东,百度百科出现乱码,解决方案

    Python scrapy爬取京东 百度百科出现乱码 解决方案 十分想念顺店杂可... 抓取百度百科,出现乱码 把页面源码下载下来之后,发现全是乱码,浏览器打开 但是浏览器链接打开就没有乱码 以下是浏 ...

  2. Python+scrapy爬取36氪网

    Python+Scrapy爬取36氪网新闻 一.准备工作: ​ ①安装python3 ​ ②安装scrapy ​ ③安装docker,用来运行splash,splash是用来提供js渲染服务(pyth ...

  3. 如何用 Python + Scrapy 爬取视频?

    今天将带大家简单了解Scrapy爬虫框架,并用一个真实案例来演示代码的编写和爬取过程. 一.scrapy简介 1. 什么是Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框 ...

  4. 手把手教你使用Python+scrapy爬取山东各城市天气预报

    1.在命令提示符环境使用pip install scrapy命令安装Python扩展库scrapy,详见Python使用Scrapy爬虫框架爬取天涯社区小说"大宗师"全文 2.使用 ...

  5. python scrapy爬取HBS 汉堡南美航运公司柜号信息

    下面分享个scrapy的例子 利用scrapy爬取HBS 船公司柜号信息 1.前期准备 查询提单号下的柜号有哪些,主要是在下面的网站上,输入提单号,然后点击查询 https://www.hamburg ...

  6. python scrapy爬取豆瓣即将上映电影用邮件定时推送给自己

    本文不是python.scrapy的教程,而是分享一个好玩的点子. python教程请看python教程,scrapy教程请看scrapy教程 爬取豆瓣高分电影教程参考python爬虫入门笔记:用sc ...

  7. python Scrapy爬取天气预报,零基础的你也可以快速上手

    目的 写一个真正意义上一个爬虫,并将他爬取到的数据分别保存到txt.json.已经存在的mysql数据库中. 目标分析: 初学者有什么不懂的可以私信我--我刚整理了一套2021最新的0基础入门教程,无 ...

  8. 使用python scrapy爬取全国小区信息(包括小区价格,经纬度,面积,户数等),并保存到mysql和excel

    目标 此次爬取的网站是楼盘网,因为只爬取小区信息,所以先从深圳小区(http://sz.loupan.com/community/)网页入手分析,然后发散爬取至全国. 爬取的信息包括 省,所属市,所属 ...

  9. Python+Scrapy爬取腾讯新闻首页所有新闻及评论

    前言 这篇博客写的是实现的一个爬取腾讯新闻首页所有的新闻及其所有评论的爬虫.选用Python的Scrapy框架.这篇文章主要讨论使用Chrome浏览器的开发者工具获取新闻及评论的来源地址. Chrom ...

最新文章

  1. Laravel5.2之Filesystem-从Dropbox中下载文件到AWS S3
  2. net下web开发人员要掌握哪些技术才算好
  3. 计算机开机显示器无显示桌面,电脑开机后显示器不亮故障排除方法
  4. 10.31模拟:总结
  5. uniq 去除重复命令使用方法介绍
  6. 数据结构-- 线性表之链式存储
  7. latex正文显示运算符
  8. 自制时间比对函数处理 比对过去时间与当前时间相差多少年多少月多少周多少分 多少秒...
  9. SQL Server的代码生成器
  10. 杭电2571 命运
  11. pytorch加载模型报错RuntimeError:Error(s) in loading state_dict for DataParallel
  12. java编程神器,IDEA的下载安装
  13. 如何把播放器转换成HTML5,Chrome把普通flash播放器转变成HTML5播放器插件:HTML5ify...
  14. 华为6108v9刷机U盘的注意事项
  15. Windows的右键菜单管理软件
  16. 如何出售自己的代码并且不让人看到自己的源码?
  17. windows对图片进行标记处理等操作
  18. 制定to-do list的艺术
  19. C++数据结构课程设计
  20. 简单又强大:基于深度学习的短文本向量嵌入方法

热门文章

  1. VUE表单校验,金额
  2. 用于苹果分级的matlab,苹果的特征检测与MATLAB实现
  3. 电脑tdr太低是什么意思_电脑帧数变低是什么原因 电脑帧数变低解决方法
  4. 三星Tab s4 港版刷国行及Root教程
  5. 唯品会控股乐蜂网,聚美陈欧惨过汪峰
  6. ios开发循环网络请求_GitHub - JadenTeng/ResourceX: iOS网络请求,网络泛型编程,工具类的封装,基于AFNetworking 实现, NSCache数据缓存...
  7. IO流之IO,NIO和AIO讲解
  8. 云梦四时歌亲密度脚本提升 亲密度奖励辅助工具策略
  9. 超硬核,30 张图解 HTTP 常见的面试题
  10. android:自定义HorizontalScrollView实现qq侧滑菜单