Python 爬取网站资源文件
爬虫原理:
以下来自知乎解释
想象你是一只蜘蛛,现在你被放到了互联“网”上。那么,你需要把所有的网页都看一遍。怎么办呢?没问题呀,你就随便从某个地方开始,比如说人民日报的首页,这个叫initial pages,用$表示吧。
在人民日报的首页,你看到那个页面引向的各种链接。于是你很开心地从爬到了“国内新闻”那个页面。太好了,这样你就已经爬完了俩页面(首页和国内新闻)!暂且不用管爬下来的页面怎么处理的,你就想象你把这个页面完完整整抄成了个html放到了你身上。
突然你发现, 在国内新闻这个页面上,有一个链接链回“首页”。作为一只聪明的蜘蛛,你肯定知道你不用爬回去的吧,因为你已经看过了啊。所以,你需要用你的脑子,存下你已经看过的页面地址。这样,每次看到一个可能需要爬的新链接,你就先查查你脑子里是不是已经去过这个页面地址。如果去过,那就别去了。
好的,理论上如果所有的页面可以从initial page达到的话,那么可以证明你一定可以爬完所有的网页。
import re,os
import urllib.request
import urllib
import ssl ssl._create_default_https_context = ssl._create_unverified_context from collections import deque queue = deque()
visited = set() origurl=url = 'http://www.***.cn/Upload/' # 入口页面, 可以换成别的
path = 'C:/Users/Administrator/Desktop/a/' queue.append(url)
cnt = 0 while queue:
url = queue.popleft() # 队首元素出队 print('已经抓取: ' + str(cnt) + ' 正在抓取 <--- ' + url)
cnt += 1
try:
urlop = urllib.request.urlopen(url, timeout=3)
except:
continue if 'image' in urlop.getheader('Content-Type'):
xpath=url.replace(origurl,'')
orig_list=xpath.split("/")
orig_ext_file = orig_list[-1]
path_sub = orig_list[:-1]
new_path=path+('/'.join(path_sub))
try:
os.makedirs(new_path)
except Exception as e:
print(e) urllib.request.urlretrieve(url, new_path+'/'+orig_ext_file) if 'html' not in urlop.getheader('Content-Type'):
continue # 处理异常
try:
data = urlop.read().decode('utf-8')
except:
continue # 正则表达 提取页面中所有队列, and判断or访问过, too加入待爬队列
linkre = re.compile('href="(.+?)"')
for x in linkre.findall(data):
if re.match(r"\?C=.", x):
continue
if re.match(r"/Upload/", x):
continue if x not in visited:
queue.append(url + x)
visited |= {url} # 标记为已访问
print('加入队列 ---> ' + x)



2.抓取一个美图高清壁纸网站
import re
import urllib.request
import urllib
import ssl ssl._create_default_https_context = ssl._create_unverified_context # 取消ssl验证https:// from collections import deque queue = deque()
visited = set() website = 'http://www.***.com/'
website_column = 'column/'
url = website + website_column + '80827.html' # 入口页面
path = './images/' queue.append(url) # 加入队列
cnt = 0
while queue:
url = queue.popleft() # 队首元素出队
visited |= {url} # 已访问 print('已经抓取: ' + str(cnt) + ' 正在抓取 <--- ' + url)
cnt += 1
try:
urlop = urllib.request.urlopen(url, timeout=3)
except:
continue
current_num_re = re.compile(r'/' + website_column + '(\d+)/')
current_num = current_num_re.findall(url)
if url == website + website_column:
continue
if 'html' not in urlop.getheader('Content-Type'):
continue # 处理异常
try:
data = urlop.read().decode('gbk')
except:
try:
data = urlop.read().decode('utf-8')
except:
continue # 正则表达 提取页面中所有队列, and判断or访问过, too加入待爬队列
linkre = re.compile('href="(.+?)"')
inside1 = re.compile(r'/' + website_column + '(.*)')
inside2 = re.compile(r'(\d+).htm') for x in linkre.findall(data):
if 'http' not in x and x not in visited:
resulturl = ''
c = inside1.findall(x)
if c:
resulturl = website + website_column + c[0]
else:
c = inside2.findall(x)
if c:
cnum = ''
cnum = current_num[0] if current_num else ''
resulturl = website + website_column + cnum + '/' + c[0] + '.htm' if resulturl:
queue.append(resulturl)
print('加入队列 ---> ' + resulturl) linkrerr = re.compile('<p><img src="(.*)" onload="btnaddress\(1\);')
src = linkrerr.findall(data)
if src:
print(src)
req = urllib.request.Request(src[0], headers={
'Connection': 'Keep-Alive',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',
'Referer': url
})
resource = urllib.request.urlopen(req, timeout=30)
orig_list = src[0].split("/")
orig_ext_file = orig_list[-1]
path_sub = orig_list[:-1]
# urllib.request.urlretrieve(src[0], path + orig_ext_file) #网站拒绝爬虫使用Referer 时, urlretrieve无法下载
foo = open(path + orig_ext_file, "wb")
str = resource.read()
foo.write(str)
foo.close()
参考地址: https://jecvay.com/2014/09/python3-web-bug-series1.html
Python 爬取网站资源文件的更多相关文章
- python爬取网站数据保存使用的方法
这篇文章主要介绍了使用Python从网上爬取特定属性数据保存的方法,其中解决了编码问题和如何使用正则匹配数据的方法,详情看下文 编码问题因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这 ...
- python爬取网站数据
开学前接了一个任务,内容是从网上爬取特定属性的数据.正好之前学了python,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...
- python爬取网站页面时,部分标签无指定属性而报错
在写爬取页面a标签下href属性的时候,有这样一个问题,如果a标签下没有href这个属性则会报错,如下: 百度了有师傅用正则匹配的,方法感觉都不怎么好,查了BeautifulSoup的官方文档,发现一 ...
- Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢
- 3.15学习总结(Python爬取网站数据并存入数据库)
在官网上下载了Python和PyCharm,并在网上简单的学习了爬虫的相关知识. 结对开发的第一阶段要求: 网上爬取最新疫情数据,并存入到MySql数据库中 在可视化显示数据详细信息 项目代码: im ...
- 教你用python爬取网站美女图(附代码及教程)
我前几篇文章都是说一些python爬虫库的用法,还没有说怎样利用好这些知识玩一些好玩的东西.那我今天带大家玩好玩又刺激的,嘻嘻!对了,requests库和正则表达式很重要的,一定要学会!一定要学会!! ...
- python爬取网站视频保存到本地
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Woo_home PS:如有需要Python学习资料的小伙伴可以加点 ...
- Python 爬取网站数据
一.使用request库实现批量下载HTML 二.使用BeautifulSoup库实现html解析 官网:https://beautifulsoup.readthedocs.io/zh_CN/v4.4 ...
- 没有内涵段子可以刷了,利用Python爬取段友之家贴吧图片和小视频(含源码)
由于最新的视频整顿风波,内涵段子APP被迫关闭,广大段友无家可归,但是最近发现了一个"段友"的app,版本更新也挺快,正在号召广大段友回家,如下图,有兴趣的可以下载看看(ps:我不 ...
随机推荐
- SVN 错误 Access to SVN Repository Forbidden的原因及解决方法
原创文章,转载请注明出处:http://www.cnblogs.com/baipengzhan/p/SVN_Access_to_SVN_Repository_Forbidden.html 当我们新 ...
- DHCP
安装 yum install -y dhcp 配置文件 默认配置为/etc/dhcpd.conf [root@samba ~]# [root@samba ~]# rpm -ql dhcp | grep ...
- 我们为什么要看《超实用的Node.JS代码段》
不知道自己Node.JS水平如何?看这张图 如果一半以上的你都不会,必须看这本书,一线工程师用代码和功能页面来告诉你每一个技巧点. 都会一点,但不知道如何检验自己,看看本书提供的面试题: 1. ...
- java从基础知识(十)java多线程(下)
首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...
- jquery easyui datagrid翻页后再查询始终从第一页开始
在查询之前将datagrid的属性pageNumber重新设置为1 var opts = grid.datagrid('options'); opts.pageNumber = 1; easyui d ...
- JDBC之存储过程
存储过程的语法创建就不说了,这里这篇博客 就挺详细了http://blog.sina.com.cn/s/blog_52d20fbf0100ofd5.html. 1. Java代码调用没有参数的存错过程 ...
- 使用CSS隐藏HTML元素的4种常用方法
现在的网页设计越来越动态化,我们经常需要隐藏某些元素,在特定的时候才显示它们.我们通常可以使用4种方法来隐藏和显示元素. 这4种显示和隐藏元素的技术各自有它们自己的优点的缺点,下面来举例说明. 在这篇 ...
- linux 下Qt WebEngine 程序打包简单记录
本次记录仅作参考. 程序说明: 程序是一个编解码器控制管理的工具,使用到的库有:Qt的WebEngine.OpenGL模块.poco库.libmicrohttpd.libcurl.libvlc.同时程 ...
- latex公式编号
1 \begin{flalign*} 2 % In this way (this arrange of &), the equation will in the center and alig ...
- linux 软连接和硬链接
硬链接 ln sourceFile targetFile 硬链接只能给文件创建,不能为目录建立硬链接,硬链接不能跨分区创建, 硬链接会增加inode连接数, 硬链接的文件删除不影响其他文件 课外: ...