看我如何利用Python写简单网络爬虫
看我如何利用Python写简单网络爬虫
黑武士 发表于3年前
看我如何利用Python写简单网络爬虫
  • 发表于 3年前
  • 阅读 46497
  • 收藏 114
  • 点赞 2
  • 评论 18

【腾讯云】如何购买服务器最划算?>>>   

摘要: Python网络爬虫

平时没事喜欢看看freebuf的文章,今天在看文章的时候,无线网总是时断时续,于是自己心血来潮就动手写了这个网络爬虫,将页面保存下来方便查看
 
先分析网站内容,红色部分即是网站文章内容div,可以看到,每一页有15篇文章

随便打开一个div来看,可以看到,蓝色部分除了一个文章标题以外没有什么有用的信息,而注意红色部分我勾画出的地方,可以知道,它是指向文章的地址的超链接,那么爬虫只要捕捉到这个地址就可以了。

接下来在一个问题就是翻页问题,可以看到,这和大多数网站不同,底部没有页数标签,而是查看更多,这里让我当时突然有点无从下手。


不过在查看源文件时我发现了如下图所示的一个超链接,经测试它指向下一页,那么通过改变其最后的数值,就可以定位到相应的页数上。

那么由以上信息,就可以对爬虫的步骤有一个相应的解决方案
1.抓取每一页上的所有文章的位置

2.捕捉每一页文章的URL

3.处理捕捉到的URL

那么问题又来了,我该如何定位每一篇文章在其源代码中的位置呢?

以第一篇文章为例,在源代码中查询”<dt><a href=”这个字符串,为什么要查询这个字符串呢?因为每一篇文章的url都以它开头,那么我只要找到这个字符串就定位了每一篇文章的开始位置,定位到文章的开始位置后,还必须定位文章的结束位置,才能提取出中间的url,如下图所示

代码:

import urllib
import string
#定义要抓取的页面
url = 'http://www.freebuf.com/articles'
#读取要抓取的页面
globalcontent = urllib.urlopen(url).read()
#捕捉文章列表
#这里在源码中查询"<dt><a href="这个字符串
new_inner01_h = globalcontent.find('<dt>a href=')
print news_inner01_h

运行结果:可以看到,查到第一篇文章的字符串位置在整个源代码中的第13607个字符,接下来继续查找该文章的url尾部

代码:

import urllib
import string
#定义要抓取的页面
url = 'http://www.freebuf.com/articles'
#读取要抓取的页面
globalcontent = urllib.urlopen(url).read()
#捕捉文章列表
#这里在源码中查询"<dt><a href="这个字符串
new_inner01_h = globalcontent.find('<dt>a href=')
print news_inner01_h
#这里在源码中查询".html"这个字符串
new_inner01_l = globalcontent.find('.html')
print news_inner01_l

运行结果:可以看到,url的结尾位置在第13661个字符上,那么接下来就可以把我想要的真实的文章url地址提取出来


代码:

import urllib
import string
#定义要抓取的页面
url = 'http://www.freebuf.com/articles'
#读取要抓取的页面
globalcontent = urllib.urlopen(url).read()
#捕捉文章列表
#这里在源码中查询"<dt><a href="这个字符串
new_inner01_h = globalcontent.find('<dt>a href=')
print news_inner01_h
#这里在源码中查询".html"这个字符串
new_inner01_l = globalcontent.find('.html')
print news_inner01_l
#这里对文档流进行分片,从查找到的第一篇文章的头部开始,到尾部结束给提取出来
#注意,头部我进行加13,尾部加5,那是因为查找到的指针处于该字符串的开始,如果不做处理那么结果就不是我想要的数据,所以要把指针向前移动
news_inner01 = globalcontent[news_inner01_h+13:news_inner01_l+5]
print news_inner01

运行结果:
如下图所示,到这里成功提取出了第一篇文章的url地址,那么后面的事情就好办了,我只需要循环对文档流进行如上操作,得出每一篇文章的地址即可,最后对每一篇文章做处理就行了

以下代码之所以进行异常捕捉,是我发现如果不对异常进行处理,那么,url返回值会多一个空白行,导致不能对抓取到的文章进行处理,所以这里进行异常捕捉,忽略捕捉到的异常

至 此,一个最基本功能的网络爬虫就实现了,当然还可以自己加更多功能,我这里因为我只是写来玩玩,毕竟很晚了,太困了,实在不想写了,想睡觉了,所以就写这 么多了,这里只是一个思路而已,还可以添加很多功能,我这里没有用到面向对象的知识,如果利用面向对象的知识,那么这个爬虫还可以更完善。

import urllib
import string
url = 'http://www.freebuf.com/articles'
globalcontent = urllib.urlopen(url).read()
news_start = globlacontent

cout = 1
while count <= 16:
    try:
        news_inner_head = news_start.find('<dt><a href=')
        news_inner_tail = news_start.find('.html')
        news_inner_url = new_start[news_inner_head+13:news_inner_tail+5]
        print news_inner_url
        news_start = news_start[news_inner_tail+5:]
        
        filename = news_inner_url[-10:]
        urllib.urlretrieve(news_inner_url,filename)
        count += 1
    except:
        print 'Download Success!'
    finally:
        if count == 16:
            break

好了,不多说 了,上两张效果图,睡觉了!

标签: Python爬虫
共有 人打赏支持
粉丝 6
博文 13
码字总数 49122
评论 (18)
yoory29
line 12
可以用 “>”吧
new_inner01_l = globalcontent.find('>')
黑武士

引用来自“yoory29”的评论

line 12
可以用 “>”吧
new_inner01_l = globalcontent.find('>')
哦,不对,不可以,因为全局查找会查找到很多>会乱,不好定位到url上,所以只能查找.html最合适
wbchn
这么规律为什么不用正则?
黑武士

引用来自“wbchn”的评论

这么规律为什么不用正则?
临时写着玩的,当时没想那么多,能实现就行了。
___Null
BeautifulSoup
红薯瓜瓜
网站不错
tkggusraqk
还是得到对象方便呀
noprom
不错不错4
明天以后
你可以研究下scrapy爬虫框架,再研究下django网站框架。然后你就可以像部分网站那样,抓取某一方面的内容,放到自己网站上,然后再加上一些广告。就等着钱来了...
临峰不畏
最好用正则式抓取有用的信息,这会方便很多。
临峰不畏

引用来自“明天以后”的评论

你可以研究下scrapy爬虫框架,再研究下django网站框架。然后你就可以像部分网站那样,抓取某一方面的内容,放到自己网站上,然后再加上一些广告。就等着钱来了...

顶!
刘-_-航
写python爬虫最好用scrapy框架去写。
刘-_-航
你用的urliib写的 既然是python就应该知道 urllib是有bug的 有的页面是不能爬去的,在python 2.6升级到2.7的时候urllib有个很大的变动,所以现在最好不要用这个库了。
以前写网络请求和爬虫可以用urllib,但是现在写爬虫用scrapy,写网络数据请求用requests,。
vivianwendy123
楼主写的好赞13
推荐一个免费好用的云端爬虫开发平台
不需要安装环境,云上运行爬虫
http://www.shenjianshou.cn/

Wangggg

引用来自“tkggusraqk”的评论

还是得到对象方便呀
得到对象就是已婚男人了
sosozzzx
推荐使用神箭手云爬虫,完全在云上编写和执行爬虫,不需要配置任何开发环境,快速开发快速实现。 

简单几行 javascript 就可以实现复杂的爬虫,同时提供很多功能函数:反反爬虫、 js 渲染、数据发布、图表分析、反防盗链等,这些在开发爬虫过程中经常会遇到的问题都由神箭手帮你解决。 
南风不竟
from bs4 import BeautifulSoup
妮妮早上好
Python基础与爬虫技术
课程学习地址:http://www.xuetuwuyou.com/course/195
课程出自学途无忧网:http://www.xuetuwuyou.com


课程简介
本作为一种便捷地收集网上信息并从中抽取出可用信息的方式,网络爬虫技术变得越来越有用。使用Python这样的简单编程语言,你可以使用少量编程技能就可以爬取复杂的网站。 《Python 基础与爬虫技术》讲解了从静态页面爬取数据的方法以及使用缓存来管理服务器负载的方法。此外,本课程还介绍了如何使用AJAX URL和Firebug扩展来爬取数据,以及有关爬取技术的更多真相,比如使用浏览器渲染、管理cookie、通过提交表单从受验证码保护的复杂网站中抽取数据等。

本课程使用Scrapy创建了一个高级网络爬虫,并对一些真实的网站进行了爬取。
《Python 基础与爬虫技术》介绍了如下内容:
通过跟踪链接来爬取网站;
使用xml从页面中抽取数据;
构建线程爬虫来并行爬取页面;
将下载的内容进行缓存,以降低带宽消耗;
解析依赖于JavaScript的网站;
与表单和会话进行交互;
解决受保护页面的验证码问题;
对AJAX调用进行逆向工程 ;
使用Scrapy创建高级爬虫。


课程目录
第1章:Python安装及IDLE工具与语法入门
1.课程导入
2.Python简介、安装及IDLE工具_什么是编程语言及Python历史
3.Python简介、安装及IDLE工具_python特点
4.Python简介、安装及IDLE工具_python开发环境配置-1
5.Python简介、安装及IDLE工具_python开发环境配置-2
6.Python简介、安装及IDLE工具_本章作业
7.Python语法入门_基本数据类型_number及float及none及bool数据类型
8.Python语法入门_基本数据类型_string类型
9.Python语法入门_变量


第2章:Python数据结构与控制流语句
10.程序基本组成及输入和输出
11.基本数据类型间转换的常用方法
12.Python的数据结构-列表
13.Python的数据结构-集合
14.Python的数据结构-元组
15.Python的数据结构-字典
16.Python运算符与表达式
1
×
黑武士
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: