爬虫基本流程 发起请求:通过HTTP库向目标站点发起请求,也就是发送一个Request,请求可以包含额外的header等信息,等待服务器响应 获取响应内容:如果服务器能正常响应,会得到一个
爬虫基本流程
1.百度图片爬虫
在这里有一个小技巧,百度图片展示是下拉式的,要想看更多的图片,需要滑动滚轮让界面加载才可以查看。
普通的爬虫对于百度图片的url只会接受到未滚动滚轮前界面所展示的所有信息
因此这里有一个小技巧,如上图红框中的信息index,在这里用字符flip替换掉index,即可实现图片分页,但其实分页图片都是存在在一个界面的,也就意味着爬虫时不需要对分页做处理。
实现代码如下
import reimport requests
import os
# 1.拿到url
word=input('你想看有颜色的图片吗,请输入:')
if not os.path.exists(word):
os.mkdir(word)
url="https://image.baidu.com/search/flip?tn=baiduimage&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word="+word
head={"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36"}
# 2.得到网页源代码
r=requests.get(url,headers=head)
#<response [200]> 200状态码 请求成功
#ret=r.text #ret 得到就是网页源代码
ret=r.content.decode('utf-8') #ret 得到就是网页源代码
# 3.拿到所有图片的url
#"objURL"
result=re.findall('"objURL":"(.*?)",',ret)
# 4.保存所有图片
for i in result:
try:
r = requests.get(i,timeout=3)
except Exception as e:
print(e)
continue
#取几张图片。取50张
path = i[0:50]
#判断url后10位是否是图片类型的结尾
end=re.search(r'\.jpg$|\.jpeg$|\.gif$|\.png$',path)
if end ==None:
path = path + '.jpg'
print(path)
path= re.sub('/','',path)
with open(word + '/' + path,'wb') as f:
f.write(r.content)
代码中可以通过输入自己想要的关键词,修改想要的图片数量参数,来下载对应的图片
2.网站图片
这种专门的图片网站,通常包含分页选项,以及每个图片的链接,对应到图片的详细页面,其中详细界面通常包含1张以上的图片。
因此爬虫不仅需要对分页做处理,同时需要对每一个页的每一个链接下的详细界面做处理获取
实现代码如下:
import os'''
页面一共35
http://ailuotuku.com/page_1.html
'''
from bs4 import BeautifulSoup#网页解析
import re #正则匹配
import urllib.request,urllib.error #制定url
import requests
#创建正则表达式对象,表示规则
#图片链接
findlink=re.compile(r'<a href="(.*?)" target="_blank">')
#图片标题
findtitle=re.compile(r'<h1>(.*?)</h1>')
#图片
findimg=re.compile(r'<img.*?src="(.*?)".*?>',re.S)
#爬数据
def getdata():
#1.调用获取页面的函数
for i in range(1,36):
url="http://ailuotuku.com/page_%s.html"%i
html1=askURL(url)
#2.解析数据
soup1=BeautifulSoup(html1,"html.parser")
for item1 in soup1.find_all('div',class_="update_area_content"):
item1=str(item1)
#re库查找正则表达式
link=re.findall(findlink,item1)
for j in link:
j=str(j)
html2 = askURL(j)
soup2 = BeautifulSoup(html2, "html.parser")
data_title=[]
data_img=[]
for item2 in soup2.find_all('div', class_="main_left single_mian"):
item2=str(item2)
title=re.findall(findtitle,item2)
for item3 in soup2.find_all('div',class_='content_left'):
item3=str(item3)
image=re.findall(findimg,item3)
for img in image:
data_img.append(img)
print(title)
print(data_img)
#保存图片
for filename in title:
for url in data_img:
file=url.split('/')[-1]
head = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.93 Safari/537.36"}
response = requests.get(url, headers=head)
if not os.path.exists('data/%s'%filename):
os.mkdir('data/%s'%filename)
with open('data/%s/'%filename + file, 'wb') as f:
f.write(response.content)
else:
pass
def askURL(url):
head={"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.93 Safari/537.36"}
#伪装浏览器
request=urllib.request.Request(url,headers=head)
html=""
try:
response=urllib.request.urlopen(request)
html=response.read().decode("utf-8")
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
return html
def main():
data=getdata()
if __name__ =="__main__":
main()