转载请注明出处: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 爬取百度贴吧指定帖子的发帖人和回帖人相关推荐

  1. 利用python的爬虫技术爬取百度贴吧的帖子

    在爬取糗事百科的段子后,我又在知乎上找了一个爬取百度贴吧帖子的实例,为了巩固提升已掌握的爬虫知识,于是我打算自己也做一个. 实现目标:1,爬取楼主所发的帖子 2,显示所爬去的楼层以及帖子题目 3,将爬 ...

  2. python tkinter界面 多进程启动scrapy爬取百度贴吧的回复,显示爬取进度,并可以搜索回帖人,指定时间生成词云图,用pyinstaller打包成exe(七)

    爬取单个帖子one_tiezi_spider.py ''' 这个是爬取 单个帖子的爬虫 大概思路:          1.进入该帖子的第1页,获取帖子的初始信息(标题.发帖人.tid.总页数)等    ...

  3. 经典爬虫:用Scrapy爬取百度股票

    前言 今天我们编写一个用 Scrapy 框架来爬取百度股票的代码,之前写过一篇爬取百度股票的文章(点我),代码的逻辑和这篇文章的逻辑是一样的,用到的解析器不同罢了. Scrapy 爬虫框架 Scrap ...

  4. 三十一、Scrapy爬取百度图片

    @Author:Runsen Runsen近段时间进入Scrapy,写了几个爬虫练练手,就找百度图片入手了.本文就是Scrapy的入门文章. 文章目录 目标 创建项目 分析逻辑 代码 目标 爬取 百度 ...

  5. python爬百度新闻_13、web爬虫讲解2—Scrapy框架爬虫—Scrapy爬取百度新闻,爬取Ajax动态生成的信息...

    crapy爬取百度新闻,爬取Ajax动态生成的信息,抓取百度新闻首页的新闻rul地址 有多网站,当你浏览器访问时看到的信息,在html源文件里却找不到,由得信息还是滚动条滚动到对应的位置后才显示信息, ...

  6. python爬取百度贴吧指定内容

    环境:python3.6 1:抓取百度贴吧-linux吧内容 基础版 抓取一页指定内容并写入文件 萌新刚学习Python爬虫,做个练习 贴吧链接: http://tieba.baidu.com/f?k ...

  7. python爬取贴吧所有帖子-Python爬虫爬取百度贴吧的帖子

    同样是参考网上教程,编写爬取贴吧帖子的内容,同时把爬取的帖子保存到本地文档: #!/usr/bin/python #_*_coding:utf-8_*_ import urllib import ur ...

  8. python百度贴吧怎么爬取最早的帖子_Python爬虫爬取百度贴吧的帖子

    同样是参考网上教程,编写爬取贴吧帖子的内容,同时把爬取的帖子保存到本地文档: #!/usr/bin/python #_*_coding:utf-8_*_ import urllib import ur ...

  9. Python爬虫爬取百度贴吧的帖子

    同样是参考网上教程,编写爬取贴吧帖子的内容,同时把爬取的帖子保存到本地文档: #!/usr/bin/python #_*_coding:utf-8_*_ import urllib import ur ...

最新文章

  1. 才知道创建数据表的后面int(M)的m居然和存储大小没有关系
  2. 隔壁组Leader降级了!从不pua,亲自写代码,自己加班也不让下属加班!
  3. 排错经历:openstack搭建dashboard进入输入帐号密码登录后报错
  4. 【tensorflow】tf.layers.conv1d函数解析(一维卷积)
  5. Commit request failed Commit failed. Ref must be HEAD and is HEAD
  6. 蜂鸣器音乐代码 天空之城_潮玩 | 艺术展览,乐队live现场,网红小黑泥,贩卖“美好”的市集……一场未来公共生活,天空之城和你一起探索!...
  7. make menuconfig选择m编译为驱动模块
  8. (操作系统题目题型总结)第四章:存储管理
  9. 108_Power Pivot购物篮分析分组GENERATE之笛卡尔积、排列、组合
  10. 网易丁磊:创造中国特色文化精品,助力实现中国文化大时代
  11. cassendra数据模型
  12. 微信小程序云开发教程-互联网软件的运作模式
  13. 【转载】smobiler说明
  14. Python 实现求矩阵的伴随矩阵
  15. IRQL Ring0实现
  16. python做var模型_在Python中使用pandas statsmodels的VAR模型
  17. C++学生管理系统课程设计
  18. 怎么学好python?
  19. arcgis10.2跨域解决方案
  20. 使用Canvas实现网页鼠标签名效果

热门文章

  1. 无人驾驶技术入门(一)| 百度无人驾驶的引路人
  2. 锁存器Latch和触发器Flip-flop的区别
  3. 关于网页中显示生僻字的方法
  4. 使用switch-case来实现银行存款问题 计算存款利息。有N元,想存M年。有3种方法可选: (1)活期,年利率为r1 0.36% (2)一年期定期,年利率为r2 2.25% 从键盘获取存款年
  5. IT史记:愤怒的杰里·桑德斯
  6. 关于报错Unknown custom element:did you register the component correctly? For recursive components的解决方式
  7. JavaScript学习:利用第三方接口做手机归属地查询
  8. 转生活中的各种食品安全问题
  9. oracle ebs版本查看,Oracle EBS R12 - 如何取得EBS某个文件的版本号
  10. Jackson 数据类型转换(使用JavaType)