Scrapy 爬取百度贴吧指定帖子的发帖人和回帖人
转载请注明出处:http://blog.csdn.net/gamer_gyt
博主微博:http://weibo.com/234654758
Github:https://github.com/thinkgamer
前言
该篇文章将是Scrapy爬虫系列的开篇,随后会不定时更新该框架方面的内容和知识,在scrapy之前写爬虫主要用的BeautifulSoup, request 和urllib,但随着使用程度的加深,慢慢意识到功能和效率都是不够的,那么便重新接触了Scrapy框架,并尝试着写出一些有趣的东西。
什么是Scrapy
它是一个应用程序框架,用来抓取并提取网站中的结构化数据,在数据挖掘,信息处理等方面十分有用。
安装
pip install Scrapy
它是一个python包,依赖于以下几个python包
- lxml : XML和HTML解析
- parsel :基于lxml的HTML/XML解析器
- w3lib :处理网页编码和URL解析器
- twisted :一个异步网络框架
- cryptography and pyOpenSSL :处理各种网络级安全需求
创建一个简单的项目
scrapy startproject tiebaSpider
目录结构为
tiebaSpider/scrapy.cfg # 配置文件tiebaSpider/ # py 模块__init__.pyitems.py # 定义一些数据模型文件pipelines.py # 管道,用来进行数据的保存settings.py # 关于项目的一些配置spiders/ # 该目录下编写自己的代码逻辑__init__.py
在soiders/下新建一个tibe.py文件,内容为:
# coding: utf-8import scrapyclass TiebaSpider(scrapy.Spider):name = "tiebaSpider"def start_requests(self):urls = ['https://tieba.baidu.com/f?kw=%E6%88%92%E8%B5%8C&ie=utf-8&pn=0']for url in urls:yield scrapy.Request(url=url, callback=self.parse)def parse(self,response):page = response.url.split("pn=")[1]filename = "tieba-%s.html" % pagewith open(filename, 'wb') as f:f.write(response.body)self.log('Saved file %s' % filename)
- name: 爬虫名字
- start_requests: 返回一个可迭代的请求地址
- parse: 解析网页的函数
- yield:python 生成器
运行爬虫:
scrapy crawl tiebaSpider
这里我们也可以这样写
# coding: utf-8import scrapyclass TiebaSpider(scrapy.Spider):name = "tiebaSpider"start_urls = ['https://tieba.baidu.com/f?kw=%E6%88%92%E8%B5%8C&ie=utf-8&pn=0',]def parse(self,response):page = response.url.split("pn=")[1]filename = "tieba-%s.html" % pagewith open(filename, 'wb') as f:f.write(response.body)self.log('Saved file %s' % filename)
因为parse是scrapy的默认回调函数,当然如果你要写好几自己定义的函数的话,就必须要指定自己的回调函数。
爬取贴吧用户
背景
爬取贴吧的尽可能多的用户名,作为推广使用(暂时使用以下的方法来获取用户名,后续会更新一种新的方法:对于给定的贴吧名,爬取其前三页所有帖子的发帖人和回帖人,这里只保存用户名)
分析
这里的实现思路是search 出来指定的贴吧,然后获取所有贴吧前三页的帖子 href,然后保存到文件中,再启用另外一个爬虫逐个帖子去爬取解析用户名
代码结构
tiebadatatiebaspiders__init__.pytieba1.py # 获取所有的帖子的链接tieba2.py # 获取发帖人和回帖人的用户名__init__.pyitems.pymiddlewares.pypipelines.pysettings.pyname.txt #存放贴吧名scrapy.cfg
代码实现
tieba1.py
# coding: utf-8import scrapy
import urllib
import timeclass TiebaSpider(scrapy.Spider):name = 'tieba'def __init__(self):self.urls = []# 加载贴吧名fr = open("name.txt", "r")for one in fr.readlines():for i in range(0, 3):self.urls.append('https://tieba.baidu.com/f?kw=' +urllib.quote(one.strip()) + '&ie=utf-8&pn=' + str(i * 50))fr.close()def start_requests(self):urls = self.urlsfor url in urls:yield scrapy.Request(url=url, callback=self.parse)def parse(self, response):sel = scrapy.Selector(response)ahref_list = sel.xpath('//a[re:test(@class, "j_th_tit ")]//@href').extract()fw = open("data/%s_all_href.txt" % time.strftime('%Y%m%d'), "a")for ahref in ahref_list:href = "https://tieba.baidu.com" + ahreffw.write(href + "\n")fw.close()
tieba2.py
# coding: utf-8import scrapy
import time
from scrapy.http.request import Request
from scrapy.http import HtmlResponseclass TiebaSpider2(scrapy.Spider):name = 'tieba2'def __init__(self):self.urls = []# 加载贴吧名fr = open("data/%s_all_href.txt" % time.strftime('%Y%m%d'), "r")for one in fr.readlines():self.urls.append(one.strip())fr.close()def start_requests(self):urls = self.urlsfor one in urls:yield scrapy.Request(url=one, callback=self.parse)def parse_uname(self, response):# response = HtmlResponse(url=page_url.url)sel = scrapy.Selector(response)name_list = sel.xpath('//li[re:test(@class, "d_name")]//a/text()').extract()# print respons fw = open("data/%s_all_name.txt" % time.strftime('%Y%m%d'), "a")for name in list(set(name_list)):fw.write(name.encode("utf-8"))fw.write("\n")fw.close()def parse(self, response):sel = scrapy.Selector(response)# 可能有些帖子被删除try:# 得到每个帖子有多少页num = int(sel.xpath('//span[re:test(@class,"red")]//text()').extract()[1]) # 遍历每页获得用户名for page_num in range(1, num + 1):one_url = response.url + "?pn=" + str(page_num)yield Request(url=one_url, callback=self.parse_uname) except Exception as e:pass
代码的github地址为:点击查看
总结
相比BeautifulSoup ,urllib,request来讲,Scrapy更加的快捷,高效和灵活,而且使用lxml,parsel 来进行网页内容的解析比BS也更快
【技术服务】,详情点击查看: https://mp.weixin.qq.com/s/PtX9ukKRBmazAWARprGIAg
扫一扫 关注微信公众号!号主 专注于搜索和推荐系统,尝试使用算法去更好的服务于用户,包括但不局限于机器学习,深度学习,强化学习,自然语言理解,知识图谱,还不定时分享技术,资料,思考等文章!
Scrapy 爬取百度贴吧指定帖子的发帖人和回帖人相关推荐
- 利用python的爬虫技术爬取百度贴吧的帖子
在爬取糗事百科的段子后,我又在知乎上找了一个爬取百度贴吧帖子的实例,为了巩固提升已掌握的爬虫知识,于是我打算自己也做一个. 实现目标:1,爬取楼主所发的帖子 2,显示所爬去的楼层以及帖子题目 3,将爬 ...
- python tkinter界面 多进程启动scrapy爬取百度贴吧的回复,显示爬取进度,并可以搜索回帖人,指定时间生成词云图,用pyinstaller打包成exe(七)
爬取单个帖子one_tiezi_spider.py ''' 这个是爬取 单个帖子的爬虫 大概思路: 1.进入该帖子的第1页,获取帖子的初始信息(标题.发帖人.tid.总页数)等 ...
- 经典爬虫:用Scrapy爬取百度股票
前言 今天我们编写一个用 Scrapy 框架来爬取百度股票的代码,之前写过一篇爬取百度股票的文章(点我),代码的逻辑和这篇文章的逻辑是一样的,用到的解析器不同罢了. Scrapy 爬虫框架 Scrap ...
- 三十一、Scrapy爬取百度图片
@Author:Runsen Runsen近段时间进入Scrapy,写了几个爬虫练练手,就找百度图片入手了.本文就是Scrapy的入门文章. 文章目录 目标 创建项目 分析逻辑 代码 目标 爬取 百度 ...
- python爬百度新闻_13、web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息...
crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息, ...
- python爬取百度贴吧指定内容
环境:python3.6 1:抓取百度贴吧-linux吧内容 基础版 抓取一页指定内容并写入文件 萌新刚学习Python爬虫,做个练习 贴吧链接: http://tieba.baidu.com/f?k ...
- python爬取贴吧所有帖子-Python爬虫爬取百度贴吧的帖子
同样是参考网上教程,编写爬取贴吧帖子的内容,同时把爬取的帖子保存到本地文档: #!/usr/bin/python #_*_coding:utf-8_*_ import urllib import ur ...
- python百度贴吧怎么爬取最早的帖子_Python爬虫爬取百度贴吧的帖子
同样是参考网上教程,编写爬取贴吧帖子的内容,同时把爬取的帖子保存到本地文档: #!/usr/bin/python #_*_coding:utf-8_*_ import urllib import ur ...
- Python爬虫爬取百度贴吧的帖子
同样是参考网上教程,编写爬取贴吧帖子的内容,同时把爬取的帖子保存到本地文档: #!/usr/bin/python #_*_coding:utf-8_*_ import urllib import ur ...
最新文章
- 才知道创建数据表的后面int(M)的m居然和存储大小没有关系
- 隔壁组Leader降级了!从不pua,亲自写代码,自己加班也不让下属加班!
- 排错经历:openstack搭建dashboard进入输入帐号密码登录后报错
- 【tensorflow】tf.layers.conv1d函数解析(一维卷积)
- Commit request failed Commit failed. Ref must be HEAD and is HEAD
- 蜂鸣器音乐代码 天空之城_潮玩 | 艺术展览,乐队live现场,网红小黑泥,贩卖“美好”的市集……一场未来公共生活,天空之城和你一起探索!...
- make menuconfig选择m编译为驱动模块
- (操作系统题目题型总结)第四章:存储管理
- 108_Power Pivot购物篮分析分组GENERATE之笛卡尔积、排列、组合
- 网易丁磊:创造中国特色文化精品,助力实现中国文化大时代
- cassendra数据模型
- 微信小程序云开发教程-互联网软件的运作模式
- 【转载】smobiler说明
- Python 实现求矩阵的伴随矩阵
- IRQL Ring0实现
- python做var模型_在Python中使用pandas statsmodels的VAR模型
- C++学生管理系统课程设计
- 怎么学好python?
- arcgis10.2跨域解决方案
- 使用Canvas实现网页鼠标签名效果
热门文章
- 无人驾驶技术入门(一)| 百度无人驾驶的引路人
- 锁存器Latch和触发器Flip-flop的区别
- 关于网页中显示生僻字的方法
- 使用switch-case来实现银行存款问题 计算存款利息。有N元,想存M年。有3种方法可选: (1)活期,年利率为r1 0.36% (2)一年期定期,年利率为r2 2.25% 从键盘获取存款年
- IT史记:愤怒的杰里·桑德斯
- 关于报错Unknown custom element:did you register the component correctly? For recursive components的解决方式
- JavaScript学习:利用第三方接口做手机归属地查询
- 转生活中的各种食品安全问题
- oracle ebs版本查看,Oracle EBS R12 - 如何取得EBS某个文件的版本号
- Jackson 数据类型转换(使用JavaType)