网页爬虫抓取百度图片(import几个向百度发送请求,有post和get两个方法)

优采云 发布时间: 2021-12-04 01:13

  网页爬虫抓取百度图片(import几个向百度发送请求,有post和get两个方法)

  首先导入几个需要用到的包:

  import requests #需要用这个包向百度发送请求

import re #需要用这个包进行正则匹配

import time #休眠一下,以免给服务器造成太大压力

  这里请求的主要功能是向百度发送请求,即模仿人工操作进行访问。有post和get两种方式。这里我们使用get方法。

  然后,开始向百度发送请求。当然这里需要百度图片的链接。先访问百度图片,看看链接是什么样子的。

  

  url 列如下所示:

  http://image.baidu.com/search/index?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=皮卡丘

  去掉一些不需要的内容后,可以是这样:

  http://image.baidu.com/search/index?tn=baiduimage&word=皮卡丘

  然后分析网址。第一个必须是固定格式,不能更改。后面这个词=皮卡丘显然就是我们搜索的关键词。url被解析,然后向百度发送请求。代码显示如下:

  html = requests.get(url)

html.encoding = html.apparent_encoding #这里可以对需要爬取的页面查看一下源码,一般都是utf-8,但是不全是。

html = html.text #这里需要获取对应的文本,以便后面进行正则匹配操作

  

  接下来的操作是对源码进行操作。最好对web前端有一定的了解,如果没有,至少查一下源码(最简单的操作就是在网址栏前面加上view-source);

  首先在源码页面搜索jpg(百度图片后缀,先找到图片链接):

  

  只需获取一个链接并对其进行分析:

  抓取里面的http:\/\/\/forum\/pic\/item\/6cad1f30e924b8998595da4079061d950b7bf6b6.jpg里面,访问,发现可以访问。多试几次,发现只能访问以objURL开头的,而以objURL开头的也可能无法访问。不管怎样,先把所有的

  "ObjURL":"xxxx"

  找到格式中的所有链接,然后需要使用正则匹配。代码显示如下:

  urls = re.findall('"objURL":"(.*?)"',html,re.S) #导入的re包就在这里用

  需要注意的是,re.findall匹配的数据是一个列表,需要用for循环一一访问:

  i = 0

for url in urls:

time.sleep(3) #休眠3秒

imag = requests.get(url,timeout = 6).content

#timeout代表每次request请求最多6秒,不然万一卡住了呢

if imag:

with open(str(i) + '.jpg','wb') as f:

print('正在下载第 %d 张图片:%s' % (i + 1,url))

f.write(imag)

i += 1

else:

print('链接超时,图片下载失败')

print('图片下载成功')

  写了一个最简单的爬虫,但是如果有一点错误,就会报错。没有所谓的鲁棒性。如何改进爬虫将在下一篇文章中讲解。

  完整代码如下,大家可以自己体验:

  import requests

import re

import time

url = 'http://image.baidu.com/search/index?tn=baiduimage&word=皮卡丘'

html = requests.get(url)

html.encoding = html.apparent_encoding

html = html.text

urls = re.findall('"objURL":"(.*?)"',html,re.S)

i = 0

for url in urls:

time.sleep(3) #休眠3秒

imag = requests.get(url,timeout = 6).content

#timeout代表每次request请求最多6秒,不然万一卡住了呢

if imag:

with open(str(i) + '.jpg','wb') as f:

print('正在下载第 %d 张图片:%s' % (i + 1,url))

f.write(imag)

i += 1

else:

print('链接超时,图片下载失败')

print('图片下载成功')

  不算空行和注释,只有 20 行代码。果然,人生苦短,我用python!

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线