Pyhton爬虫多线程提升数据下载的性能优化
很幸运地上了两次Tony老师关于python爬虫的课(收获巨多),在这里我对第一次课做一下知识总结:
1.什么是爬虫?
自动从网络上进行数据采集的程序
- 一个网络蜘蛛就是一种机器人,或者软件代理。大体上,它从一组要访问的URL链接开始,可以称这些URL为种子。爬虫访问这些链接,它辨认出这些页面的所有超链接,然后添加到这个URL列表,可以称作检索前沿。这些URL按照一定的策略反复访问。
- 很多站点,尤其是搜索引擎,都使用爬虫提供最新的数据,它主要用于提供它访问过页面的一个副本,然后,搜索引擎就可以对得到的页面进行索引,以提供快速的访问。
- 蜘蛛也可以在web上用来自动执行一些任务,例如检查链接,确认html代码;也可以用来抓取网页上某种特定类型信息,例如抓取电子邮件地址(通常用于垃圾邮件)。
2.为什么有爬虫?
场景:
(1).新浪新闻报道的新闻从哪里来的?
①新闻肯定最开始产生于记者,记者将新闻发布到某些平台
②其他平台爬取并使用该平台记者所写的新闻,相当于一个人写了文章,另一个人推送文章
(2.)搜索引擎百度为什么可以承载属于其他网站的信息?
①百度很大一部分工作都是在运行自己的爬虫,采集其他网页并存储下来,等待搜索
②通过爬虫来不断补充自己的知识链,实时更新搜索的结果,内容
(3)电商平台
拼多多采集其他电商平台商品的价格浮动,处理分析
(4)大量数据样本需求
大数据的时代数据分析需要大量的数据样本,采集网络数据
3.在百度上搜索淘宝到得到淘宝的网站信息
- 百度在万维网上爬取了淘宝网的信息,存储在自己的服务器里面,当我们搜索淘宝的时候,是如何从服务器的某个位置准确的把
这些信息找出来的呢?
①DNS协议:解析域名:
- DNS协议是用来将域名转换为IP地址(也可以将IP地址转换为相应的域名地址)。
- DNS允许终端用户设备将给定的人类可读URL转换为网络可以理解的机器可用IP地址。
尽管IP地址能够唯一地标记网络上的计算机,但IP地址是一长串数字,不直观,而且用户记忆十分不方便,于是人们又发明了另一套字符型的地址方案,即所谓的域名地址。IP地址和域名是一一对应的,这份域名地址的信息存放在一个叫域名服务器(DNS,Domain name server)的主机内,使用者只需了解易记的域名地址,其对应转换工作就留给了域名服务器。域名服务器就是提供IP地址和域名之间的转换服务的服务器。——摘自《百度百科》
淘宝的域名->淘宝的ip地址->用户通过ip地址请求服务器->服务器返还请求的淘宝信息->浏览器解析数据,显示界面
②对真实的url路径进行动态的修改
- 锁定抓取的目标,获得目标页面的url
- 在堆糖网上搜索杨幂我们可以得到域名:
https://www.duitang.com/search/?kw=杨幂&type=feed
在我们的pycharm里面显示为:
https://www.duitang.com/search/?kw=%E6%9D%A8%E5%B9%82&type=feed
(中间的文字被替换成的字符串设计URL编码) - 右键检查查看网页源代码
往下滑动网页发现:我们每滑动一段就会增加一个条目:
(网页的动态加载/局部刷新)
点击其中的一个条目可以看到这个部分的url:
- 在堆糖网上搜索杨幂我们可以得到域名:
- 修改url
- 删除不必要的成分
- 点开这个链接我们可以看到下面这个页面,复制页面的内容,在浏览器查找一个JSON解析网站,粘贴内容我们观察一下:
这里显示的就是我们的局部页面的数据:total:3600 next_start:48
说明该页面一共将显示3600张图片,下一个部分将从第48张开始,即每个部分显示48张图片
- 删除不必要的成分
- 修改url,让每次加载从0开始,最多加载1000张
再次访问链接,将新的网页上的数据内容进行解析可以看到变化:
这次是每次加载100张,一共有3600张 - 利用字符串进行数据查找,并提取数据
在pycharm里面要用到第三方的请求库requests,在cmd里面用pip指令安装:pip install requests
第一步请求获取服务器返回的数据
import requests
""" 利用字符串的格式化,每次访问不同的链接,从index开始请求图片数据
用get请求数据,如上图网页已经做出要求
最后的数据都存储在str_get列表里面
"""
URL="https://www.duitang.com/napi/blog/list/by_search/?kw=%E6%9D%A8%E5%B9%82&start={}&limit=3600"
str_get=[]
for index in range(0,3600,100):
URL.format(index)
s=requests.get(URL).content.decode("utf-8")
str_get.append(s)
第二部解析数据:提取需要的内容(图片的链接)
将得到的url存储在url_all列表里
left_part='"https:'
right_part= '"'
url_all=[]
for s in str_get:
ip_get = []
start=0
while s.find(left_part, start)!=-1:
l = s.find(left_part, start)
r=s.find(right_part,l+1)
url=s[l+1:r]
url_get.append(url)
start=r
print(url)
url_all.extend(url_get)
- 存储数据
从得到的图片链接获得图片
numbers=0
for url in ip_all:
numbers+=1
data=requests.get(url)
path="image/"+str(numbers)+".jpg"
with open(path,'wb+') as file:
file.write(data.content)
然后我们可以在左侧看到存储的图片了
到此我们已经成功爬取到了杨幂的图片了🎉
感谢阅读❤
参考资料:《百度文库》