爬虫原理:

以下来自知乎解释

首先你要明白爬虫怎样工作。
想象你是一只蜘蛛,现在你被放到了互联“网”上。那么,你需要把所有的网页都看一遍。怎么办呢?没问题呀,你就随便从某个地方开始,比如说人民日报的首页,这个叫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. GUI学习中错误Exception in thread "main" java.lang.NullPointerException

    运行时出现错误:Exception in thread "main" java.lang.NullPointerException 该问题多半是由于用到的某个对象只进行了声明,而没 ...

  2. JS中SetTimeOut和SetInterval方法的区别?

    1.setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭.由 ...

  3. SecureCRT上传和下载文件

    SecureCRT上传和下载文件(下载默认目录) SecureCR 下的文件传输协议有ASCII .Xmodem .Ymodem .Zmodem ASCII:这是最快的传输协议,但只能传送文本文件. ...

  4. Kinect 总结---Kinect基本认识

    玩了Kinect也有差不多一年的时间了,觉得Kinect是个挺好玩挺有未来的玩意.但是很经常做完了一次,下次又得重新看源码,没有把Kinect里的知识总结起来变为自己的知识,所以特意重新总结一下自己使 ...

  5. todo

     ID生成器要做成兼容分布式, 数据库ef控制要改成手动升级, 异常日志模块,操作日志某快,,, 日志服务器,, 图片服务器,,,动静分离, 前后台分离,, 可扩展性,无状态化集群弹性部署, 数据库主 ...

  6. std::unique_lock<std::mutex> or std::lock_guard<std::mutex> C++11 区别

    http://stackoverflow.com/questions/20516773/stdunique-lockstdmutex-or-stdlock-guardstdmutex The diff ...

  7. R可视化lend_club 全球最大的P2P平台数据75W条

    lend_club 全球最大的P2P平台2007~2012年贷款数据百度云下载. 此文章基于R语言做简单分析. rm(list=ls()) #清除变量 gc() #释放内存 step1 考虑到后续分析 ...

  8. spring boot开发入门

    最近学习了spring boot,刚刚入门,整理下

  9. 为什么axios请求接口会发起两次请求

    之前在使用axios发现每次调用接口都会有两个请求,第一个请求时option请求,而且看不到请求参数,当时也没注意,只当做是做了一次预请求,判断接口是否通畅,但是最近发现并不是那么回事. 首先我们知道 ...

  10. php编译 :virtual memory exhausted: Cannot allocate memory

    有时候用vps建站时需要通过编译的方式来安装主机控制面板.对于大内存的VPS来说一般问题不大,但是对于小内存,比如512MB内存的VPS来说,很有可能会出现问题,因为编译过程是一个内存消耗较大的动作. ...