目录
一、requests模块
1.安装requests
如果是在windows下,你使用的python编程软件, 在Terminal下输入python -m pip install requests模块即可。
如果是Linux系统,在任意终端输入pip install requests
2.requests模块的基本用法
requests最常用的方法是get(),这个函数有很多参数,这里简单的看几个:
req=requests.get(url=url,headers=headers,params=params,timeout=1,auth=auth)
1)url:被爬取网页的url
2)headers:头信息,常用于伪装User-Agent,写法如下
headers= {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36"}
3)timeout:设置超时时间,有的网站可能打不开,为了不占用时间,在所设置的时间内没有相应的网站被排除
4)params:url中涵盖的参数
如 url=http://tieba.baidu.com/f?kw=周杰伦&pn=50
我们可以将params写成:
params={
'kw':'周杰伦',
'pn':'50'
}
url写成:http://tieba.baidu.com/f?
5)auth:当访问某网站提示输入用户名密码时,自动输入
使用方式:首先定义auth
auth=('账户名','密码')
在调用:req=requests.get(url=url,auth=auth)
二、百度图片爬取程序
1.需求分析
我们进入百度图片搜索,搜索周杰伦,看到一下界面。
打开源码分析,看到图片的链接地址。
复制这一段链接在浏览器中打开,发现可以正常打开。所以我们的目的就是编写python程序提取图片url然后下载。
经过分析,我发现百度图片的url并不是静态文件代码,而是JS生成的。鼠标右键查看源代码。很明显的可以看出这一段JS代码。
并且我发现在不翻页的情况下,百度图片的首页只会显示不超过30张图片。
我们可以得出结论:
1.百度搜索图片只会显示不超过30张图片
2.图片是由JS文件动态生成
2.URL分析
百度图片搜索的URL如下,tn=baiduimage代表搜索图片。
word=周杰伦代表搜索关键字
这是两段图片的URL,可以确定大部分是以.jpg结尾。
http://img2.imgtn.bdimg.com/it/u=1435330949,2933798089&fm=26&gp=0.jpg
http://img3.imgtn.bdimg.com/it/u=1334437254,2025956451&fm=26&gp=0.jpg
3.正则表达式分析
1)图片搜索URL分析
http://image.baidu.com/search/index?tn=baiduimage&word=周杰伦
根据上面的URL,我们可以写入出正则表达式:
http://image.baidu.com/search/index?tn=baiduimage&word={}
参数用{}代替,我们可以用format来导入关键字
2)图片URL分析
由于图片是由JS生成的,所以我们写出匹配JS代码的正则表达式,我们看到JS代码,是一个键值对的形式。这样的正则表达式非常好写。
"thumbURL":"http://img2.imgtn.bdimg.com/it/u=1435330949,2933798089&fm=26&gp=0.jpg"
以thumbURL开头,采用非贪婪匹配,用子模式取出结果,如下:
"thumbURL":"(.*?)"
4.程序设计
1.定义一个类,名为BaiduImage_spider
2.初始化构建,定义若干个参数,定义百度图片搜索的url,定义一个数字用于计数(用于文件命名)count,定义关键字名(即搜索栏中填写的)word,定义文件保存路径dir,定义图片正则regex,一段代码用于判断文件路径是否存在
3.定一个函数用于获取图片的链接:get_image()
4.定义一个函数用于下载图片:download_image()
5.定义一个函数用于保存图片到本地:save_local()
6.定义入口函数
5.程序代码
注意事项:
1.本程序所需模块有requests(下载页面),parse(字符串转编码),random和time(模拟人操作,不定时请求),re正则匹配,os(判断路径和生成路径)
2.如果在执行程序时发现下载的页面报403错误,建议更换User-Agent
import requests
from urllib import parse
import random
import os
import re
import time
class BaiduImage_spider(object):
def __init__(self):
self.url="http://image.baidu.com/search/index?tn=baiduimage&word={}"
self.count=1
self.word=input("请输入关键词名:")
self.dir="C:\\Users\\Administrator\\Desktop\\新建文件夹\\"
self.regex='"thumbURL":"(.*?)"'
#判断是否存在路径,不存在则创建
if not os.path.exists(self.dir):
os.makedirs(self.dir)
#获取图片链接
def get_images(self,url):
#获取响应结果
rep=requests.get(url=url,headers= {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36").text
#正则匹配,返回图片链接
pattern=re.compile(self.regex,re.S)
image_lists=pattern.findall(rep)
#遍历集合,下载每一张图片
for i in image_lists:
self.download_images(i)
#间隔请求
time.sleep(random.randint(0,2))
#下载图片
def download_images(self,url):
#下载图片
image= requests.get(url=url, headers={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36"}).content
#字符串拼接
filename = self.dir + self.word + "_" + str(self.count) + ".jpg"
self.count += 1
#保存到本地
self.save_local(filename,image)
print(filename,"下载成功........")
#本地存盘
def save_local(self,filename,file):
with open(filename,"wb") as f:
f.write(file)
#入口函数
def run(self):
#字符转码
word=parse.quote(self.word)
url=self.url.format(word)
self.get_images(url)
if __name__=="__main__":
spider=BaiduImage_spider()
spider.run()