文章目录
- 1.什么是爬虫
- 2.爬虫的思想
- 一些知识
- 1 。 环境的搭建请看:
- 2 .
- 3 。:Requests urllib的升级版本打包了全部功能并简化了使用方法(点我查看官方文档)
- 4 : beautifulsoup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.(点我查看官方文档)(QQ图片20161022193315作为一个菜鸟就别去装逼用 正则表达式了,匹配不到想要的内容,容易打击积极性。老老实实的用beautifulsoup 吧!虽然性能差了点、但是你会爱上它的。)
- 5 :LXML 一个HTML解析包 用于辅助beautifulsoup解析网页(如果你不用anaconda,你会发现这个包在Windows下pip安装报错,QQ图片20161021230903用了就不会啦。)。
- 6 : OS 系统内置模块
- 代码
本文为博主九师兄(QQ:541711153 欢迎来探讨技术)原创文章,未经允许博主不允许转载。
1.什么是爬虫
以前从来没学过如何写爬虫,借学python的机会,学习写爬虫,什么是爬虫呢?
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
2.爬虫的思想
比如说网站http://www.mzitu.com/,这里面有很多诱惑的图片,我们想下载下来,我要一个一个的去下载吗?这也太难了,太繁琐了,写个程序下载就好了,而下载我们知道下载图片需要图片的地址比如http://i.meizitu.net/2018/02/03c03.jpg这个图片的连接
<a href="http://www.mzitu.com/118979/4"><img src="http://i.meizitu.net/2018/02/03c03.jpg" alt="软妹子艾可丝从青涩稚嫩向成熟性感蜕变"></a>
但是我们不知道图片的连接啊,所以我要去下载到有图片网站的html文件,从里面分析出来图片的地址。然后发请求去获取图片的内容,最后存储到本地,就是下载了。
那么由此可见爬虫分为以下几步:
1。确定要爬虫爬取的目标:http://www.mzitu.com/xinggan/
2。分析网站html
看图知道总共有98页,每页又有很多图集。
3。点开一个图集
每个图集都有很多图片
那么我们需要先获取2。3两步的数字,才能获取这个性感标签下的所有图片。
一些知识
1 。 环境的搭建请看:
http://blog.csdn.net/qq_21383435/article/details/79240276
2 .
使用from urllib import request我们知道能根据一个超链接地址发送请求获取里面的html,但是这个去抓取网页图片会被禁止,所以我们要伪造来源reference,不然会这样
人家看你一直起请求数据,会认为你是恶意来抓取图片的,时间久了会禁止你连接,所以我们要在程序运行期间不停地伪造来源reference
3 。:Requests urllib的升级版本打包了全部功能并简化了使用方法(点我查看官方文档)
4 : beautifulsoup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.(点我查看官方文档)(QQ图片20161022193315作为一个菜鸟就别去装逼用 正则表达式了,匹配不到想要的内容,容易打击积极性。老老实实的用beautifulsoup 吧!虽然性能差了点、但是你会爱上它的。)
5 :LXML 一个HTML解析包 用于辅助beautifulsoup解析网页(如果你不用anaconda,你会发现这个包在Windows下pip安装报错,QQ图片20161021230903用了就不会啦。)。
上面的模块需要 单独安装,下面几个就不用啦。
6 : OS 系统内置模块
代码
from bs4 import BeautifulSoup ##导入bs4中的BeautifulSoup
import os
import requests ##导入requests
#浏览器请求头(大部分网站没有这个请求头会报错、请务必加上哦)
headers = {'Accept': '*/*',
'Accept-Language': 'en-US,en;q=0.8',
'Cache-Control': 'max-age=0',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36',
'Connection': 'keep-alive',
'Referer': 'http://www.mzitu.com/'
}
all_url = 'http://www.mzitu.com/xinggan/' ##开始的URL地址
start_html = requests.get(all_url, headers=headers).content.decode('utf-8')
# print(start_html)
########### 我们的低2步 获取98页的超链接
Soup = BeautifulSoup(start_html, 'lxml') ##使用BeautifulSoup来解析我们获取到的网页(‘lxml’是指定的解析器 具体请参考官方文档哦)
all_a = Soup.find('div', class_='nav-links').find_all("a")[-2].get_text() ##意思是先查找 class为 all 的div标签,然后查找所有的<a>标签。
#print(all_a)
for page in range(1, int(all_a)+1):
page_url = all_url + 'page/' + str(page) + "/" ##同上
#print(page_url)
########### 我们的3步 获取98页中每一页图的超链接
page_html = requests.get(page_url, headers=headers).content.decode('utf-8')
#print(page_html)
#print("===================")
mpage_scop = BeautifulSoup(page_html, 'lxml')
page_html_html = mpage_scop.find('ul', id='pins').find_all('a') # .find_all("a")[-2].get_text()
print("==========>",page_html_html)
for a in page_html_html:
tu_href = a['href'] # 取出a标签的href 属性
title = a.get_text() # 取出a标签的文本
path = str(title).strip()
if path != '':
# 这一点在循环里不停地伪造来源
headerstwo = {'Accept': '*/*',
'Accept-Language': 'en-US,en;q=0.8',
'Cache-Control': 'max-age=0',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36',
'Connection': 'keep-alive',
'Referer': tu_href
}
# 因为目录不能包含以下特殊字符 否则会报错
path = path.replace(":", "")
path = path.replace("?", "")
path = path.replace("?", "")
path = path.replace("\\", "")
path = path.replace("\/", "")
path = path.replace("*", "")
path = path.replace("'", "")
path = path.replace("\"", "")
path = path.replace("<", "")
path = path.replace(">", "")
path = path.replace("|", "")
print("=========", path)
os.makedirs(os.path.join("J:\mzitu3", path)) ##创建一个存放套图的文件夹
os.chdir("J:\mzitu3\\"+path) ##切换到上面创建的文件夹
########### 我们的4步 获取98页中每一页图的超链接 对应图集的每张图的超链接
tu_html = requests.get(tu_href, headers=headerstwo).content.decode('utf-8')
tu_scop = BeautifulSoup(tu_html, 'lxml')
tu_html = tu_scop.find('div', class_='pagenavi').find_all("a")[-2].get_text()
#print(tu_html)
for tu_real in range(1, int(tu_html)+1):
each_url = tu_href + '/' + str(tu_real)
print(each_url)
each_html = requests.get(each_url, headers=headerstwo).content.decode('utf-8')
img_Soup = BeautifulSoup(each_html, 'lxml')
img_url = img_Soup.find('div', class_='main-image').find('img')['src']
#print(img_url)
name = img_url[-9:-4] ##取URL 倒数第四至第九位 做图片的名字
img = requests.get(img_url, headers=headerstwo)
f = open(name + '.jpg', 'ab') ##写入多媒体文件必须要 b 这个参数!!必须要!!
f.write(img.content) ##多媒体文件要是用conctent哦!
f.close()
运行结果