爬虫原理:

以下来自知乎解释

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

    一OOP的作用 在Python中,类是面向对象设计(OOP)的主要工具.通过使用类这种工具,OOP可以: 1.分解代码,最小化代码的冗余. 2.通过定制现有的代码,来编写新的程序,而不用在原处进行修改 ...

  2. Google数据交换格式:ProtoBuf

    Protocol Buffer ProtocolBuffer是Google公司的一个开源项目,用于结构化数据串行化的灵活.高效.自动的方法,有如XML,不过它更小.更快.也更简单.你可以定义自己的数据 ...

  3. MySQL安装与设置

    下载zip,配置 1,系统变量添加:...\mysql-5.7.10-winx64,环境变量添加:%MYSQL_HOME%\bin 2,修改MySQL.ini basedir=(同系统变量路径) da ...

  4. mysql 快速简单安装法

    网上下载的编译好的包 最好安装在 /usr/local 目录下面: 我用的mysql的版本的是:mysql--linux-i686-icc-glibc23.tar.gz 在官网上就可以下载到. 先期工 ...

  5. WebService初学

    作为一个初学者,在遇到新的知识点的时候,搞清这个知识点的名称含义,是有必要的.那什么是WebService呢? 顾名思义,它是一个运行在web上的服务.这个服务通过网络为我们的程序提供服务方法.类似一 ...

  6. Mac 操作技巧

    1.OS X下如何在同一个程序之中快速切换窗口 command+`(1左边的那个) 2.

  7. struts2使用annotation注意事项

    struts2使用annotation注意事项 1.包名只能以.action .actions  .struts  .struts2结尾.如:com.cnbolgs.web.actions 2.类名只 ...

  8. .net一般处理程序(httphandler)实现文件下载功能

    Handler文件代码如下: public class MDMExporterWeb : IHttpHandler { public void ProcessRequest(HttpContext c ...

  9. 测试基础:Bug管理那些事_20160910

    1.bug由来 虫子爬进主机引起继电器短路,导致机器故障.真正的缺陷是:主机散热孔少装了块金属丝,这样才能防止虫子爬到主机. 2.什么是bug? bug是缺陷的一种表现形式,而一个缺陷是可以引发多种b ...

  10. sql 取新的列名含义

    SELECT a.*, 1 DELETABLE, '' YEAR_ON, '' MONTH_ON, TOOL_STATUS status0 FROM TOOL a 说明:其中tool字段有tool_s ...