php 抓取网页 源码( 斯巴达,常用爬虫制作模块的基本用法极度推荐!)

优采云 发布时间: 2022-01-15 23:07

  php 抓取网页 源码(

斯巴达,常用爬虫制作模块的基本用法极度推荐!)

  使用 Python 的 urllib 和 urllib2 模块制作爬虫的示例教程

  更新时间:2016-01-20 10:25:51 作者:XiaoluD

  本文章主要介绍使用Python的urllib和urllib2模块制作爬虫的示例教程,展示这两个常用的爬虫制作模块的基本用法,强烈推荐!有需要的朋友可以参考以下

  urllib

  在学习了python的基础知识之后,我有点困惑。当我闭上眼睛时,一种空白的窒息感不断袭来。我还缺乏练习,所以我用爬虫来练习我的手。学完Spartan python爬虫课程后,我将自己的经验整理如下,供后续翻阅。整个笔记主要分为以下几个部分:

  1.做一个简单的爬虫程序

  第一个环境描述

  这个没什么好说的,直接上代码吧!

  

'''

@ urllib为python自带的一个网络库

@ urlopen为urllib的一个方法,用于打开一个连接并抓取网页,

然后通过read()方法把值赋给read()

'''

import urllib

url = "http://www.lifevc.com"#多嘴两句,为什么要选lifevc呢,主要是最近它很惹我.

html = urllib.urlopen(url)

content = html.read()

html.close()

#可以通过print打印出网页内容

print content

  很简单,基本没什么好说的,这就是python的魅力,几行代码就可以搞定。

  当然,我们只是爬网,没有真正的价值。然后我们开始做一些有意义的事情。

  2.小试刀

  抓取*敏*感*词*图片

  其实也很简单,因为要抓取图片,还需要先分析网页的源码。

  (这里是了解html基础知识,浏览器以chrome为例)

  如图,这里对接下来的步骤做一个简单的说明,请参考。

  打开网页,右击,选择“inspect Element”(底部项)

  点击下方弹出框最左侧的问号,问号会变成蓝色

  移动鼠标点击我们要抓拍的图片(可爱的女孩)

  如图,我们可以在源码中看到图片的位置。

  

  复制下面的源代码

  

sign=3d5aacaab21c8701d6b6b2ee177e9e6e/17a6d439b6003af329aece2e342ac65c1138b6d8.

jpg" />

  经过分析对比(这里略),我们基本上可以看出要抓拍的图像的几个特征:

  后面会更新正则表达式,请注意

  根据上面的判断,直接上代码

  

'''

@本程序用来下载*敏*感*词*图片

@re 为正则说明库

'''

import urllib

import re

# 获取网页html信息

url = "http://tieba.baidu.com/p/2336739808"

html = urllib.urlopen(url)

content = html.read()

html.close()

# 通过正则匹配图片特征,并获取图片链接

img_tag = re.compile(r'class="BDE_Image" src="(.+?\.jpg)"')

img_links = re.findall(img_tag, content)

# 下载图片 img_counter为图片计数器(文件名)

img_counter = 0

for img_link in img_links:

img_name = '%s.jpg' % img_counter

urllib.urlretrieve(img_link, "//Users//Sean//Downloads//tieba//%s" %img_name)

img_counter += 1

  如图,我们会抓取你看懂的图片

  

  3.总结

  如上两节,我们可以很方便的访问网页或图片。

  补充一点小技巧,如果遇到自己不是很了解的库或者方法,可以通过下面的方法来初步了解。

  或输入相关搜索。

  当然百度也可以,但是效率太低了。推荐使用相关搜索(你懂的,绝对满意)。

  这里我们讲解如何爬取网页和下载图片,下面我们将讲解如何爬取有限爬取网站。

  urllib2

  上面我们解释了如何抓取网页和下载图片,下一节我们将解释如何抓取有限的抓取网站

  首先,我们还是用上个类中的方法来捕获一个大家都用的网站作为例子。本文主要分为以下几个部分:

  1.爬取受限页面

  首先使用我们在上一节中学到的知识对其进行测试:

  

'''

@本程序用来抓取blog.csdn.net网页

'''

import urllib

url = "http://blog.csdn.net/FansUnion"

html = urllib.urlopen(url)

#getcode()方法为返回Http状态码

print html.getcode()

html.close()

#输出

  

403

  这里我们的输出是 403,表示访问被拒绝;200 表示请求成功完成;404 表示找不到 URL。

  可以看出csdn已经被屏蔽了。通过第一节的方法,是无法获取网页的。这里我们需要启动一个新库:urllib2

  但是我们也看到浏览器可以发送那个文本,无论我们模拟浏览器操作,我们都可以得到网页信息。

  老办法,我们来看看浏览器是如何向csdn服务器提交请求的。首先,简单介绍一下方法:

  

  以下是排序后的Header信息

  

Request Method:GET

Host:blog.csdn.net

Referer:http://blog.csdn.net/?ref=toolbar_logo

User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.104 Safari/537.36

  然后根据提取的Header信息,使用urllib2的Request方法模拟浏览器向服务器提交请求。代码如下:

  

# coding=utf-8

'''

@本程序用来抓取受限网页(blog.csdn.net)

@User-Agent:客户端浏览器版本

@Host:服务器地址

@Referer:跳转地址

@GET:请求方法为GET

'''

import urllib2

url = "http://blog.csdn.net/FansUnion"

#定制自定义Header,模拟浏览器向服务器提交请求

req = urllib2.Request(url)

req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36')

req.add_header('Host', 'blog.csdn.net')

req.add_header('Referer', 'http://blog.csdn.net')

req.add_header('GET', url)

#下载网页html并打印

html = urllib2.urlopen(req)

content = html.read()

print content

html.close()

  呵呵,如果你限制我,我就跳过你的限制。据说只要浏览器可以访问,就可以被爬虫爬取。

  2.对代码做一些优化

  简化提交 Header 方法

  我发现每次写这么多req.add_header对自己来说是一种折磨。有没有什么方法可以使用,只要复制。答案是肯定的。

  

#input:

help(urllib2.Request)

#output(因篇幅关系,只取__init__方法)

__init__(self, url, data=None, headers={}, origin_req_host=None, unverifiable=False)

通过观察,我们发现headers={},就是说可以以字典的方式提交header信息.那就动手试试咯!!

#只取自定义Header部分代码

csdn_headers = {

"User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36",

"Host": "blog.csdn.net",

'Referer': 'http://blog.csdn.net',

"GET": url

}

req = urllib2.Request(url,headers=csdn_headers)

  是不是很容易发现,感谢斯巴达在这里的无私启蒙。

  提供动态标题信息

  如果按照上面的方法爬取,很多时候提交的信息会因为提交的信息过于单一而被服务器当作机器爬虫拒绝。

  那么我们是否有一些更聪明的方式来提交一些动态数据呢,答案肯定是肯定的。而且很简单,直接上代码!

  

'''

@本程序是用来动态提交Header信息

@random 动态库,详情请参考

'''

# coding=utf-8

import urllib2

import random

url = 'http://www.lifevc.com/'

my_headers = [

'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)',

'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; InfoPath.1',

'Mozilla/4.0 (compatible; GoogleToolbar 5.0.2124.2070; Windows 6.0; MSIE 8.0.6001.18241)',

'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)',

'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; Sleipnir/2.9.8)',

#因篇幅关系,此处省略N条

]

random_header = random.choice(headers)

# 可以通过print random_header查看提交的header信息

req = urllib2.Request(url)

req.add_header("User-Agent", random_header)

req.add_header('Host', 'blog.csdn.net')

req.add_header('Referer', 'http://blog.csdn.net')

req.add_header('GET', url)

content = urllib2.urlopen(req).read()

print content

  其实很简单,所以我们对代码完成了一些优化。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线