一、网络爬虫

Python爬虫开发工程师,从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。

网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。网络爬虫另外一些不常使用的名字还有蚂蚁,自动索引,模拟程序或者蠕虫。爬虫就是自动遍历一个网站的网页,并把内容都下载下来.


                          搜索引擎与网络爬虫

二、通用性搜索引擎(通用爬虫)

随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。搜索引擎(Search Engine),例如传统的通用搜索引擎AltaVista,Yahoo!和Google等,作为一个辅助人们检索信息的工具成为用户访问万维网的入口和指南。但是,这些通用性搜索引擎也存在着一定的局限性,如:

(1) 不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。

(2)通用搜索引擎的目标是尽可能大的网络覆盖率,有限的搜索引擎服务器资源与无限的网络数据资源之间的矛盾将进一步加深。

(3)万维网数据形式的丰富和网络技术的不断发展,图片、数据库、音频、视频多媒体等不同数据大量出现,通用搜索引擎往往对这些信息含量密集且具有一定结构的数据无能为力,不能很好地发现和获取。

(4)通用搜索引擎大多提供基于关键字的检索,难以支持根据语义信息提出的查询。

为了解决上述问题,定向抓取相关网页资源的聚焦爬虫应运而生。聚焦爬虫是一个自动下载网页的程序,它根据既定的抓取目标,有选择的访问万维网上的网页与相关的链接,获取所需要的信息。与通用爬虫(general?purpose web crawler)不同,聚焦爬虫并不追求大的覆盖,而将目标定为抓取与某一特定主题内容相关的网页,为面向主题的用户查询准备数据资源。

三、聚焦爬虫实例之爬取段子的爬虫

以糗事百科为例子。

糗事百科是不需要登录的,所以也没必要用到Cookie,另外糗事百科有的段子是附图的,我们把图抓下来图片不便于显示,那么我们就尝试过滤掉有图的段子吧。

好,现在我们尝试抓取一下糗事百科的热门段子吧,每按下一次回车我们显示一个段子。

1.确定URL并抓取页面代码

首先我们确定好页面的URL是 http://www.qiushibaike.com/hot/page/1,其中最后一个数字1代表页数,我们可以传入不同的值来获得某一页的段子内容。

我们初步构建如下的代码来打印页面代码内容试试看,先构造最基本的页面抓取方式,看看会不会成功

\# -*- coding:utf-8 -*-
import urllib
import urllib2page = 1
url = 'http://www.qiushibaike.com/hot/page/' + str(page)
try:request = urllib2.Request(url)response = urllib2.urlopen(request)print response.read()
except urllib2.URLError, e:if hasattr(e,"code"):print e.codeif hasattr(e,"reason"):print e.reason

运行程序,哦不,它竟然报错了,真是时运不济,命途多舛啊

line 373, in _read_statusraise BadStatusLine(line)
httplib.BadStatusLine: ''

好吧,应该是headers验证的问题,我们加上一个headers验证试试看吧,将代码修改如下

\# -*- coding:utf-8 -*-
import urllib
import urllib2page = 1
url = 'http://www.qiushibaike.com/hot/page/' + str(page)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers = { 'User-Agent' : user_agent }
try:request = urllib2.Request(url,headers = headers)response = urllib2.urlopen(request)print response.read()
except urllib2.URLError, e:if hasattr(e,"code"):print e.codeif hasattr(e,"reason"):print e.reason

嘿嘿,这次运行终于正常了,打印出了第一页的HTML代码,大家可以运行下代码试试看。在这里运行结果太长就不贴了。

2.提取某一页的所有段子

好,获取了HTML代码之后,我们开始分析怎样获取某一页的所有段子。

首先我们审查元素看一下,按浏览器的F12,截图如下

我们可以看到,每一个段子都是

1
2
3
4
5
6
content  =  response.read().decode( 'utf-8' )
pattern  =  re. compile ( '<div.*?author">.*?<a.*?<img.*?>(.*?)</a>.*?<div.*?' +
                          'content">(.*?)<!--(.*?)-->.*?</div>(.*?)<div class="stats.*?class="number">(.*?)</i>' ,re.S)
items  =  re.findall(pattern,content)
for  item  in  items:
     print  item[ 0 ],item[ 1 ],item[ 2 ],item[ 3 ],item[ 4 ]

  

现在正则表达式在这里稍作说明 
1. ? 是一个固定的搭配,.和代表可以匹配任意无限多个字符,加上?表示使用非贪婪模式进行匹配,也就是我们会尽可能短地做匹配,以后我们还会大量用到 .*? 的搭配。 
2. (.?)代表一个分组,在这个正则表达式中我们匹配了五个分组,在后面的遍历item中,item[0]就代表第一个(.?)所指代的内容,item[1]就代表第二个(.*?)所指代的内容,以此类推。 
3. re.S 标志代表在匹配时为点任意匹配模式,点 . 也可以代表换行符。

这样我们就获取了发布人,发布时间,发布内容,附加图片以及点赞数。

在这里注意一下,我们要获取的内容如果是带有图片,直接输出出来比较繁琐,所以这里我们只获取不带图片的段子就好了。

所以,在这里我们就需要对带图片的段子进行过滤。

我们可以发现,带有图片的段子会带有类似下面的代码,而不带图片的则没有,所以,我们的正则表达式的item[3]就是获取了下面的内容,如果不带图片,item[3]获取的内容便是空。

1
2
3
4
5
6
7
<div  class = "thumb" >
<a href = "/article/112061287?list=hot&s=4794990"  target = "_blank" >
<img src = "http://pic.qiushibaike.com/system/pictures/11206/112061287/medium/app112061287.jpg"  alt = "但他们依然乐观" >
< / a>
< / div>

  

所以我们只需要判断item[3]中是否含有img标签就可以了。

好,我们再把上述代码中的for循环改为下面的样子

1
2
3
4
for  item  in  items:
         haveImg  =  re.search( "img" ,item[ 3 ])
         if  not  haveImg:
             print  item[ 0 ],item[ 1 ],item[ 2 ],item[ 4 ]

  

现在,整体的代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
\ # -*- coding:utf-8 -*-
import  urllib
import  urllib2
import  re
page  =  1
url  =  'http://www.qiushibaike.com/hot/page/'  +  str (page)
user_agent  =  'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
headers  =  'User-Agent'  : user_agent }
try :
     request  =  urllib2.Request(url,headers  =  headers)
     response  =  urllib2.urlopen(request)
     content  =  response.read().decode( 'utf-8' )
     pattern  =  re. compile ( '<div.*?author">.*?<a.*?<img.*?>(.*?)</a>.*?<div.*?' +
                          'content">(.*?)<!--(.*?)-->.*?</div>(.*?)<div class="stats.*?class="number">(.*?)</i>' ,re.S)
     items  =  re.findall(pattern,content)
     for  item  in  items:
         haveImg  =  re.search( "img" ,item[ 3 ])
         if  not  haveImg:
             print  item[ 0 ],item[ 1 ],item[ 2 ],item[ 4 ]
except  urllib2.URLError, e:
     if  hasattr (e, "code" ):
         print  e.code
     if  hasattr (e, "reason" ):
         print  e.reaso

  

运行一下看下效果:

这之中省去1千字。。。。。。

不要喷我,我给你们准备了最好的礼物:

尚学堂Python爬虫实战项目-如何爬取段子的视频教程。

大家可以找可爱又美丽的Teacher 唐 获取下载地址吧!

她的扣扣是205-621-741-5   ,17-30-178-13-30

Python网络爬虫与聚焦爬虫,如何用爬虫爬取段子相关推荐

  1. Python网络爬虫数据采集实战:同花顺动态网页爬取

    前文的爬虫都建立在静态网页基础之上,首先通过请求网站url获取到网页源代码.之后对源代码进行信息提取进而存储即可,本文则针对动态网页进行数据采集,首先介绍Ajax相关理论,之后实战爬取同花顺动态网页, ...

  2. python爬虫网络数据包_Python爬虫之多线程图虫网数据爬取(十六)

    Python爬虫之多线程图虫网数据爬取(十六) 发布时间:2019-05-14 10:11, 浏览次数:289 , 标签: Python 原创不易,转载前请注明博主的链接地址:Blessy_Zhu h ...

  3. python爬虫赚钱的途径-如何用爬虫技术赚钱?

    题主啊,我不知道你爬虫技术是什么水平,但是我觉得只要你能写出正常运行的爬虫就不应该问这种问题. 我做了四年多的爬虫(副业),大大小小做了近百个项目,既然你问了,我就答一波. 首先,你的思路不应该在卖数 ...

  4. python爬虫今日头条_python爬虫—分析Ajax请求对json文件爬取今日头条街拍美图

    python爬虫-分析Ajax请求对json文件爬取今日头条街拍美图 前言 本次抓取目标是今日头条的街拍美图,爬取完成之后,将每组图片下载到本地并保存到不同文件夹下.下面通过抓取今日头条街拍美图讲解一 ...

  5. python爬虫--Scrapy框架--Scrapy+selenium实现动态爬取

    python爬虫–Scrapy框架–Scrapy+selenium实现动态爬取 前言 本文基于数据分析竞赛爬虫阶段,对使用scrapy + selenium进行政策文本爬虫进行记录.用于个人爬虫学习记 ...

  6. Python爬虫:最牛逼的 selenium爬取方式!

    Python爬虫:最牛逼的 selenium爬取方式! 作为一个男人 在最高光的时刻 这是小编准备的python爬虫学习资料,加群:700341555即可免费获取! Python爬虫:最牛逼的 sel ...

  7. Python爬虫:运用多线程、IP代理模块爬取百度图片上小姐姐的图片

    Python爬虫:运用多线程.IP代理模块爬取百度图片上小姐姐的图片 1.爬取输入类型的图片数量(用于给用户提示) 使用过百度图片的读者会发现,在搜索栏上输入关键词之后,会显示出搜索的结果,小编想大多 ...

  8. Python爬虫之scrapy框架360全网图片爬取

    Python爬虫之scrapy框架360全网图片爬取 在这里先祝贺大家程序员节快乐,在此我也有一个好消息送给大家,本人已开通了微信公众号,我会把资源放在公众号上,还请大家小手动一动,关注过微信公众号, ...

  9. Python爬虫实例 wallhaven网站高清壁纸爬取。

    文章目录 Python爬虫实例 wallhaven网站高清壁纸爬取 一.数据请求 1.分析网页源码 2.全网页获取 二.数据处理 1.提取原图所在网页链接 2.获取高清图片地址及title 三.下载图 ...

最新文章

  1. hdoj 5199 Gunner map
  2. 常用构建数据科学应用程序的七个Python库
  3. [资料整理] Decentralized Services Orchestration, Choreography相关的几篇论文
  4. 2021-03-29 自动控制-滑模控制 Simulink仿真
  5. Java 注解深入理解
  6. 李沐《动手学深度学习》PyTorch 实现版开源,瞬间登上 GitHub 热榜!
  7. 关于Java中的随机数产生
  8. 批处理文件总结(三)
  9. Mac下的Docker及Kubernetes(k8s)本地环境搭建与应用部署、管理界面kubernetes-dashboard
  10. find命令使用案例
  11. 基于小脑模型神经网络轨迹跟踪matlab程序
  12. 如何在子控件上使用WS_EX_LAYERED
  13. 计算机如何安装cpu风扇,从零开始学装机 教你如何安装CPU风扇
  14. 安卓双摄像头录像_usb双摄像头app下载
  15. 期货大佬给交易者的交易箴言。
  16. 应用宝上架审核要求_腾讯应用宝开发者福利!2小时内审核
  17. linux CentOS7虚拟机修改静态ip地址
  18. python中一般使用几个空格表示缩进_为什么Python pep-8强烈建议使用标签上的空格来缩进?...
  19. Big Faceless Java PDF Library[BFO]
  20. jsp页面链接下载文件

热门文章

  1. Facebook体验设计小巧思
  2. 2023.3.5 第十六次周报
  3. 图解大数据 | 海量数据库查询-Hive与HBase详解
  4. 年度榜单:2012年最流行的28款免费英文字体素材
  5. 把字符串转换成整数(最详细解答)
  6. 2022多旋翼飞控主控芯片选型-F3,F4,F7及H7系列对比
  7. Win10安装msi程序报错2503和2502错误解决方案
  8. 实验24: OSPF的DR与BDR与管理员指定DR BDR
  9. Django搭建个人博客:用户的登录和登出
  10. Java 编程开发的30个技巧