爬虫原理:

以下来自知乎解释

首先你要明白爬虫怎样工作。
想象你是一只蜘蛛,现在你被放到了互联“网”上。那么,你需要把所有的网页都看一遍。怎么办呢?没问题呀,你就随便从某个地方开始,比如说人民日报的首页,这个叫initial pages,用$表示吧。
在人民日报的首页,你看到那个页面引向的各种链接。于是你很开心地从爬到了“国内新闻”那个页面。太好了,这样你就已经爬完了俩页面(首页和国内新闻)!暂且不用管爬下来的页面怎么处理的,你就想象你把这个页面完完整整抄成了个html放到了你身上。
突然你发现, 在国内新闻这个页面上,有一个链接链回“首页”。作为一只聪明的蜘蛛,你肯定知道你不用爬回去的吧,因为你已经看过了啊。所以,你需要用你的脑子,存下你已经看过的页面地址。这样,每次看到一个可能需要爬的新链接,你就先查查你脑子里是不是已经去过这个页面地址。如果去过,那就别去了。
好的,理论上如果所有的页面可以从initial page达到的话,那么可以证明你一定可以爬完所有的网页。

链接:http://www.zhihu.com/question/20899988/answer/24923424

1.爬取一个匿名可访问upload目录的网站
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 爬取网站资源文件的更多相关文章

  1. python爬取网站数据保存使用的方法

    这篇文章主要介绍了使用Python从网上爬取特定属性数据保存的方法,其中解决了编码问题和如何使用正则匹配数据的方法,详情看下文     编码问题因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这 ...

  2. python爬取网站数据

    开学前接了一个任务,内容是从网上爬取特定属性的数据.正好之前学了python,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...

  3. python爬取网站页面时,部分标签无指定属性而报错

    在写爬取页面a标签下href属性的时候,有这样一个问题,如果a标签下没有href这个属性则会报错,如下: 百度了有师傅用正则匹配的,方法感觉都不怎么好,查了BeautifulSoup的官方文档,发现一 ...

  4. Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢

  5. 3.15学习总结(Python爬取网站数据并存入数据库)

    在官网上下载了Python和PyCharm,并在网上简单的学习了爬虫的相关知识. 结对开发的第一阶段要求: 网上爬取最新疫情数据,并存入到MySql数据库中 在可视化显示数据详细信息 项目代码: im ...

  6. 教你用python爬取网站美女图(附代码及教程)

    我前几篇文章都是说一些python爬虫库的用法,还没有说怎样利用好这些知识玩一些好玩的东西.那我今天带大家玩好玩又刺激的,嘻嘻!对了,requests库和正则表达式很重要的,一定要学会!一定要学会!! ...

  7. python爬取网站视频保存到本地

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Woo_home PS:如有需要Python学习资料的小伙伴可以加点 ...

  8. Python 爬取网站数据

    一.使用request库实现批量下载HTML 二.使用BeautifulSoup库实现html解析 官网:https://beautifulsoup.readthedocs.io/zh_CN/v4.4 ...

  9. 没有内涵段子可以刷了,利用Python爬取段友之家贴吧图片和小视频(含源码)

    由于最新的视频整顿风波,内涵段子APP被迫关闭,广大段友无家可归,但是最近发现了一个"段友"的app,版本更新也挺快,正在号召广大段友回家,如下图,有兴趣的可以下载看看(ps:我不 ...

随机推荐

  1. logistic regression与SVM

    Logistic模型和SVM都是用于二分类,现在大概说一下两者的区别 ① 寻找最优超平面的方法不同 形象点说,Logistic模型找的那个超平面,是尽量让所有点都远离它,而SVM寻找的那个超平面,是只 ...

  2. 网站引入了css样式文件能访问,就是没有效果

    今天后端的同事遇到这么个问题,引入了外部css文件也能访问,就是页面上没有效果. 大概是下面这个样子: css引入如下: 我非常的纳闷,说真的我还没遇到过这种情况,UI是可以运行的,一点事都没有... ...

  3. Greenplum记录(一):主体结构、master、segments节点、interconnect、performance monitor

    结构:Client--master host--interconnect--segment host 每个节点都是单独的PG数据库,要获得最佳的性能需要对每个节点进行独立优化. master上不包含任 ...

  4. Dell R730 配置完RAID后装系统找不到硬盘。

    1. 各硬盘只是灯都正常.硬件无故障. 2. 8个600G硬盘做的RAID0和RAID5后都在装系统选盘处找不到硬盘.(注意: 第一次做raid 时,没有进行初始化init.后补做也无效,一直复现这个 ...

  5. PHP中的全局变量global和$GLOBALS的区别

    1.global Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件. 但是在函数体内定义的global变量,函数体 ...

  6. 一键批量添加材质的法线贴图-unity插件

    有时候材质做完后需要更改贴图,或者增加贴图,数量少的时候可以一张张添加和修改,数量多的时候就只能代码生成了.原理是通过名字的关联:主贴图和法线贴图大多数只是后缀的不同上,如果不是那是美术规范没做好啊, ...

  7. mac机快捷键操作

    1. 屏幕最大和缩小:command+ctrl +f 2.切换应用:comand+tab, 3.大小写转换:comand + 空格 4.切换到下/上一个标签页:同时按 ⌘-Option 和向右/左箭头 ...

  8. Codeforces Round 319 # div.1 & 2 解题报告

    Div. 2 Multiplication Table (577A) 题意: 给定n行n列的方阵,第i行第j列的数就是i*j,问有多少个格子上的数恰为x. 1<=n<=10^5, 1< ...

  9. Android之自定义侧滑菜单

    先来上图: 我们把主界面从左向右拉动,可以看到地下有一层菜单页,从透明渐渐变得不透明,从小渐渐变大,感觉上觉得菜单页是从屏幕外面被拉到屏幕中的.下面的代码实现这个DEMO: 首先是自定义控件Slidi ...

  10. jq绑定事件的4种方式

    jQuery提供了多种绑定事件的方式,每种方式各有其特点,明白了它们之间的异同点,有助于我们在写代码的时候进行正确的选择,从而写出优雅而容易维护的代码.下面我们来看下jQuery中绑定事件的方式都有哪 ...