博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 爬取网站资源文件
阅读量:7108 次
发布时间:2019-06-28

本文共 3693 字,大约阅读时间需要 12 分钟。

爬虫原理:

以下来自知乎解释

首先你要明白爬虫怎样工作。
想象你是一只蜘蛛,现在你被放到了互联“网”上。那么,你需要把所有的网页都看一遍。怎么办呢?没问题呀,你就随便从某个地方开始,比如说人民日报的首页,这个叫initial pages,用$表示吧。
在人民日报的首页,你看到那个页面引向的各种链接。于是你很开心地从爬到了“国内新闻”那个页面。太好了,这样你就已经爬完了俩页面(首页和国内新闻)!暂且不用管爬下来的页面怎么处理的,你就想象你把这个页面完完整整抄成了个html放到了你身上。
突然你发现, 在国内新闻这个页面上,有一个链接链回“首页”。作为一只聪明的蜘蛛,你肯定知道你不用爬回去的吧,因为你已经看过了啊。所以,你需要用你的脑子,存下你已经看过的页面地址。这样,每次看到一个可能需要爬的新链接,你就先查查你脑子里是不是已经去过这个页面地址。如果去过,那就别去了。
好的,理论上如果所有的页面可以从initial page达到的话,那么可以证明你一定可以爬完所有的网页。
链接:
1.爬取一个匿名可访问upload目录的网站
import re,osimport urllib.requestimport urllibimport sslssl._create_default_https_context = ssl._create_unverified_contextfrom collections import dequequeue = deque()visited = set()origurl=url = 'http://www.***.cn/Upload/'  # 入口页面, 可以换成别的path = 'C:/Users/Administrator/Desktop/a/'queue.append(url)cnt = 0while 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 reimport urllib.requestimport urllibimport sslssl._create_default_https_context = ssl._create_unverified_context  # 取消ssl验证https://from collections import dequequeue = deque()visited = set()website = 'http://www.***.com/'website_column = 'column/'url = website + website_column + '80827.html'  # 入口页面path = './images/'queue.append(url)  # 加入队列cnt = 0while 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('

 

参考地址: 

转载地址:http://mjvhl.baihongyu.com/

你可能感兴趣的文章
Android 记住密码和自动登录界面的实现(SharedPreferences 的用法)
查看>>
SageMath: 符号计算
查看>>
校园论坛与校园沟通平台的未来
查看>>
Redis List数据类型
查看>>
php 下载保存文件保存到本地的两种实现方法
查看>>
Azure IoT 技术研究系列4
查看>>
《人月神话》阅读笔记01
查看>>
Tree
查看>>
jQuery的Dom插入操作图示
查看>>
配置舒适的工作环境
查看>>
UGUI代码分析
查看>>
蓝鲸财经新闻记者实战培训
查看>>
Tcpdump Manul
查看>>
经典计算机算法设计方法(9) -- 迭代
查看>>
算法面试题解答(三)
查看>>
字典的创建和使用
查看>>
mysql 启动不了了
查看>>
LeetCode: Unique Binary Search Trees
查看>>
colormap中的内嵌彩色模块和调用方式
查看>>
标准W3C盒子模型和IE盒子模型CSS布局经典盒子模型(转)
查看>>