爬虫原理:

以下来自知乎解释

首先你要明白爬虫怎样工作。
想象你是一只蜘蛛,现在你被放到了互联“网”上。那么,你需要把所有的网页都看一遍。怎么办呢?没问题呀,你就随便从某个地方开始,比如说人民日报的首页,这个叫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. 汇编实现点亮Led灯(2440)

    1.gboot.lds OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS {    . = 0x30008000;        . = ALIGN(4);    .text ...

  2. MyEclipse10--的使用经验

    MyEclipse10--的使用经验总结 ------------------ 1.MyEclipse中的验证validation----->>用MyEclipse做ExtJs项目研发的时 ...

  3. CMA-ES 算法

    CMA-ES 算法 一.算法介绍 CMA-ES是Covariance Matrix Adaptation Evolutionary Strategies的缩写,中文名称是协方差矩阵自适应进化策略,主要 ...

  4. python版本随意切换之python2.7+django1.8.7+uwsgi+nginx源码包部署。

    资源准备: wget https://www.python.org/ftp/python/2.7.13/Python-2.7.13.tgz wget https://www.djangoproject ...

  5. Quartz 学习记录1

    原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ...

  6. runtime-给系统已有类添加属性

    在没有接触runtime之前,我们接触到的能给类进行扩展的方法有类目(category)和延展(extension)两种.类目(category)可以给系统已有类添加扩展方法但是不能添加属性,并且被添 ...

  7. mvc添加多条数据到数据库

    from : http://www.th7.cn/Program/net/201502/387849.shtml mvc的视图太强大了,个人刚刚接触.(初级菜鸟,懂的不多,往大神们指点)需求是,客户点 ...

  8. <c ss高效开发实战>看完了,Bootstrap学习是关键

    Bootstrap果真给我们带来了很多便利,学习CSS,必须要掌握很多框架和快速学习的方法. 这本书看完了,也写过几篇读书笔记,墙裂推荐.不上书封面了,只上书的导图. 这里说几点学习CSS的心得 1. ...

  9. php php-5.6.4.tar.bz2 apache 兼容问题 child pid 27858 exit signal Segmentation fault

    环境 [root envirotar]# uname -a Linux i2..el6.x86_64 # SMP Thu Jul :: UTC x86_64 x86_64 x86_64 GNU/Lin ...

  10. svn sync主从同步学习

    svn备份的方式有三种: 1svnadmin dump 2)svnadmin hotcopy 3)svnsync.  优缺点分析============== 第一种svnadmin dump是官方推荐 ...