码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Python爬虫抓取网站模板的完整版实现


    业余爱好喜欢倒弄下个人网站。对之前的个人博客网站模板不太满意,网上看到别人的网站真漂亮啊,于是想着搞下来借鉴下,仅用于个人用途。若是单个存取太麻烦,用工具的话还得找,于是想到干脆使用python实现下,python用于爬虫可真厉害。

    之前的博客搭建在了华为云,地址在这里:个人博客

    下面分享下抓去网站模板的完整版实现,亲测可用。(注:仅限个人爱好者研究使用,不要用于其他非法用途。)

    环境准备

    由于个人使用的是64位版本的python3环境,安装下用到的第三方库。

    BeautifulSoup库,简称bs4,常用的爬虫库,可以在HTML或XML文件中提取数据的网页信息提取,方便得到dom的标签和属性值。

    lxml库,python的HTML/XML的解析器,速度很快,其主要功能是解析和提取XML和HTML中的数据。

    urllib库,这个库一般不用下python内置的urllib库。这个是模拟发起网络请求,一般建议使用requests,它是对urllib的再次封装。需要注意的是python2和python3上的异同。python2上没有urllib.request。python2中的如urllib.urllib2.urlopen需改为 urllib.request.urlopen()。

    库的安装

    由于默认仓库网站被墙的原因,需要改下镜像才能成功下载。对于python3推荐使用pip或pip3的install。因为pip2是留给python2用的,如果电脑上同时有python2和python3安装的话。

    临时改变镜像:

    1. $pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple some-package # 清华源
    2. $pip3 install -i http://pypi.douban.com/simple some-package #豆瓣镜像

    用国内源码对pip进行升级:

    $pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U
    

    如果觉得每次这样临时改变镜像设置不太方便,可以对配置进行修改。

     linux下的指定位置为:

    1. $HOME/.config/pip/pip.conf
    2. #或者
    3. $HOME/.pip/pip.conf

    windows下的指定位置为:

    1. %APPDATA%\pip\pip.ini
    2. #或者
    3. %HOME%\pip\pip.ini

    实现原理 

    首先要进行网页分析,实现原理还是比较简单的,就跟用网站访问类似,你能访问到网页就能通过查看网页源代码找到里面的相关链接,js脚本和css文件等。模板无非就是需要把相关的css,js文件和网页文件下载下来。所以原理就是爬取网页找到上面的script,link标签,a herf标签,把相关的网址链接提取和保存起来存为文件,然后去重并调用urlretrieve()方法直接将远程数据下载到本地。比如你要下载某个网页或文件,只需调用urlretrieve(),指定好参数即可。

    urlretrieve(url, filename=None, reporthook=None, data=None)

    如将百度首页的网页保存下来,只需:

    1. #!/usr/bin/env python
    2. # coding=utf-8
    3. import os
    4. from urllib.request import urlretrieve
    5. def cbk(a,b,c):
    6. '''''回调函数
    7. @a:已经下载的数据块
    8. @b:数据块的大小
    9. @c:远程文件的大小
    10. '''
    11. per=100.0*a*b/c
    12. if per>100:
    13. per=100
    14. print('%.2f%%' % per)
    15. url='http://www.baidu.com'
    16. dir=os.path.abspath('.')
    17. work_path=os.path.join(dir,'baidu.html')
    18. urlretrieve(url,work_path,cbk)

    完整源码

    1. #!/usr/bin/env python
    2. # -*- coding: utf-8 -*-
    3. # by yangyongzhen
    4. # 2016-12-06
    5. from bs4 import BeautifulSoup
    6. import urllib, urllib.request, os, time
    7. import re
    8. import lxml
    9. rootpath = os.getcwd() + u'/抓取的模板/'
    10. def makedir(path):
    11. if not os.path.isdir(path):
    12. os.makedirs(path)
    13. #创建抓取的根目录
    14. makedir(rootpath)
    15. #显示下载进度
    16. def Schedule(a, b, c):
    17. '''''
    18. a:已经下载的数据块
    19. b:数据块的大小
    20. c:远程文件的大小
    21. '''
    22. per = 100.0 * a * b / c
    23. if per > 100:
    24. per = 100
    25. print('%.2f%%' % per)
    26. def grabHref(url, listhref, localfile):
    27. html = urllib.request.urlopen(url).read()
    28. html = str(html, 'gb2312', 'ignore').encode('utf-8', 'ignore')
    29. content = BeautifulSoup(html, features="lxml").findAll('link')
    30. myfile = open(localfile, 'w')
    31. pat = re.compile(r'href="([^"]*)"')
    32. pat2 = re.compile(r'http')
    33. for item in content:
    34. h = pat.search(str(item))
    35. href = h.group(1)
    36. if pat2.search(href):
    37. ans = href
    38. else:
    39. ans = url + href
    40. if not ans.__contains__(url):
    41. continue
    42. if ans.endswith('/'):
    43. ans += 'index.html'
    44. listhref.append(ans)
    45. myfile.write(ans)
    46. myfile.write('\r\n')
    47. print(ans)
    48. content = BeautifulSoup(html, features="lxml").findAll('script')
    49. pat = re.compile(r'src="([^"]*)"')
    50. pat2 = re.compile(r'http')
    51. for item in content:
    52. h = pat.search(str(item))
    53. if h:
    54. href = h.group(1)
    55. if pat2.search(href):
    56. ans = href
    57. else:
    58. ans = url + href
    59. listhref.append(ans)
    60. myfile.write(ans)
    61. myfile.write('\r\n')
    62. print(ans)
    63. content = BeautifulSoup(html, features="lxml").findAll('a')
    64. pat = re.compile(r'href="([^"]*)"')
    65. pat2 = re.compile(r'http')
    66. for item in content:
    67. h = pat.search(str(item))
    68. if h:
    69. href = h.group(1)
    70. if pat2.search(href):
    71. ans = href
    72. else:
    73. ans = url + href
    74. if not ans.__contains__(url):
    75. continue
    76. if ans.endswith('/'):
    77. ans += 'index.html'
    78. listhref.append(ans)
    79. myfile.write(ans)
    80. myfile.write('\r\n')
    81. print(ans)
    82. myfile.close()
    83. def _progress(block_num, block_size, total_size):
    84. '''回调函数
    85. @block_num: 已经下载的数据块
    86. @block_size: 数据块的大小
    87. @total_size: 远程文件的大小
    88. '''
    89. sys.stdout.write(
    90. '\r>> Downloading %s %.1f%%' %
    91. (filename, float(block_num * block_size) / float(total_size) * 100.0))
    92. sys.stdout.flush()
    93. def main():
    94. url = "http://http://www.helongx.com/" #采集网页的地址
    95. listhref = [] #链接地址
    96. localfile = 'ahref.txt' #保存链接地址为本地文件,文件名
    97. grabHref(url, listhref, localfile)
    98. listhref = list(set(listhref)) #去除链接中的重复地址
    99. curpath = rootpath
    100. start = time.perf_counter()
    101. for item in listhref:
    102. curpath = rootpath
    103. name = item.split('/')[-1]
    104. fdir = item.split('/')[3:-1]
    105. for i in fdir:
    106. curpath += i
    107. curpath += '/'
    108. print(curpath)
    109. makedir(curpath)
    110. local = curpath + name
    111. print('name:' + name)
    112. if len(name) == 0:
    113. continue
    114. if name.__contains__('www'):
    115. continue
    116. if name.__contains__('?'):
    117. continue
    118. print(local)
    119. try:
    120. urllib.request.urlretrieve(item, local, Schedule) # 远程保存函数
    121. except Exception as e:
    122. print(e)
    123. end = time.perf_counter()
    124. print(u'模板抓取完成!')
    125. print(u'一共用时:', end - start, u'秒')
    126. if __name__ == "__main__":
    127. main()

    注意事项

    针对不同的网站,需要分析下网页源码找到链接的规律。比如有的网站首页就是 www.xxx.xxx,不带index.html后缀或者后缀是别的其他的如index.aspx或index.php之类的。可以修改脚本源码,加些特殊的处理。比如自动补上首页名称和只抓取本网站的内容:

    1. for item in content:
    2. h = pat.search(str(item))
    3. href = h.group(1)
    4. if pat2.search(href):
    5. ans = href
    6. else:
    7. ans = url + href
    8. #非本站的链接不抓取
    9. if not ans.__contains__(url):
    10. continue
    11. #补上首页后缀名
    12. if ans.endswith('/'):
    13. ans += 'index.html'
    14. listhref.append(ans)
    15. myfile.write(ans)
    16. myfile.write('\r\n')
    17. print(ans)
    18. content = BeautifulSoup(html, features="lxml").findAll('script')

    引用

    python爬虫之bs4模块(超详细)_- 打小就隔路à的博客-CSDN博客_bs4模块

    bs4介绍_- 白鹿 -的博客-CSDN博客_bs4

    Python-- lxml用法_ydw_ydw的博客-CSDN博客_lxml python

    python中pip和pip3的区别、使用以及加速方法_非晚非晚的博客-CSDN博客_python3使用pip还是pip3

    Python爬虫实战案例:一键爬取,多种网页模板任你选!_Code皮皮虾的博客-CSDN博客

    python3的urlretrieve()方法的作用与使用(入门)_逸少凌仙的博客-CSDN博客_python urlretrieve 小白如何入门 Python 爬虫? - 知乎

    Python爬虫教程(从入门到精通)

    Python-xpath与bs4_「已注销」的博客-CSDN博客

    Python网络爬虫 - 飞桨AI Studio

    python 爬虫 2 (网页解析bs4、lxml、xpath、正则)_BeanInJ的博客-CSDN博客

    python爬虫训练11:正则表达式,bs4,xpath抓取网站数据对比_<编程路上>的博客-CSDN博客

    https://blog.csdn.net/weixin_43788986/category_11895372.html

    解析网页哪家强-Xpath和正则表达式(re)及BeautifulSoup的比较(文中含有三者的基本语法介绍)_莫莫先生的博客-CSDN博客_xpath和正则表达式

    Beautiful Soup 4.4.0 文档 — beautifulsoup 4.4.0q 文档

    爬虫学习笔记(五)——网页解析工具(bs4、xpath)_别呀的博客-CSDN博客_网页解析工具

    爬虫系列(一):解析网页的常见方式汇总——re、bs4、xpath——以链家租房信息爬取为例_limSedrick=quant的博客-CSDN博客

  • 相关阅读:
    Verilog实战学习到RiscV - 4 : ICEStick 评估板计数器
    AJAX: 对话框大全
    VueX简单又详细的解读,看了就会用
    洛谷 T284656 改试卷(paper)
    Unity 内存性能分析器 (Memory Profiler)
    Codeforces Round 928 (Div. 4) (A-E)
    CentOS7 k3s安装与配置
    云计算要学习哪些技术?
    由于 MAC 地址的问题,导致网络不通的原因和分析
    .NET Interop 互操作 COM+
  • 原文地址:https://blog.csdn.net/qq8864/article/details/127107263
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号