网页爬虫抓取百度图片(urllib学习python完基础,迷茫.(组图))

优采云 发布时间: 2021-12-18 23:05

  网页爬虫抓取百度图片(urllib学习python完基础,迷茫.(组图))

  网址库

  在学习了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为例)

  如图,这里是对后续步骤的简要说明,请参考。

  打开网页,右键单击并选择“检查元素”(底部项目)

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

  移动鼠标点击我们要捕捉的图片(一个可爱的女孩)

  如图,我们可以在源码中获取图片的位置

  

  复制下面的源代码

  

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服务器提交请求的。首先简单介绍一下方法:

  

  以下是整理后的头部信息

  

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. 对代码的一些优化

  简化提交头方法

  发现每次写这么多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人工客服


线