一入爬虫深似海,从此游戏是路人!总结我的python爬虫学习笔记
前言
还记得是大学2年级的时候,偶然之间看到了学长在学习python;我就坐在旁边看他敲着代码,感觉很好奇。感觉很酷,从那之后,我就想和学长一样的厉害,就想让学长教我,请他吃了一周的饭,他答应了。从此,我踏上了python编程的道路。在那之前,我成天到晚都是在打lol;但是从那天之后,几乎很少很少了。
然而到如今,这一学就是2年,我已经不再是一名小白。是的,我爱上了编程,爱上了python。如今,人工智能的时代已经来临,作为它的首选语言 python。我很自豪,今天给大家分享一下我当初学习爬虫的心得体会。
正文
〇. python 基础
先放上python 3 的官方文档:https://docs.python.org/3/ (看文档是个好习惯)
关于python 3 基础语法方面的东西,网上有很多,大家可以自行查找.
一. 最简单的爬取程序
爬取百度首页源代码:
来看上面的代码:
- 对于python 3来说,urllib是一个非常重要的一个模块 ,可以非常方便的模拟浏览器访问互联网,对于python 3 爬虫来说, urllib更是一个必不可少的模块,它可以帮助我们方便地处理URL.
- urllib.request是urllib的一个子模块,可以打开和处理一些复杂的网址
The urllib.requestmodule defines functions and classes which help in opening URLs (mostly HTTP) in a complex world — basic and digest authentication, redirections, cookies and more.
- urllib.request.urlopen()方法实现了打开url,并返回一个 http.client.HTTPResponse对象,通过http.client.HTTPResponse的read()方法,获得response body,转码最后通过print()打印出来.
urllib.request.urlopen(url, data=None, [timeout, ]***, cafile=None, capath=None,cadefault=False, context=None)For HTTP and HTTPS URLs, this function returns a http.client.HTTPResponseobject slightly modified.< 出自: https://docs.python.org/3/library/urllib.request.html >
- decode('utf-8')用来将页面转换成utf-8的编码格式,否则会出现乱码
二 模拟浏览器爬取信息
在访问某些网站的时候,网站通常会用判断访问是否带有头文件来鉴别该访问是否为爬虫,用来作为反爬取的一种策略。
先来看一下Chrome的头信息(F12打开开发者模式)如下:
如图,访问头信息中显示了浏览器以及系统的信息(headers所含信息众多,具体可自行查询)
Python中urllib中的request模块提供了模拟浏览器访问的功能,代码如下:
from urllib import request
url = 'http://www.baidu.com'
# page = request.Request(url)
# page.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36')
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
page = request.Request(url, headers=headers)
page_info = request.urlopen(page).read().decode('utf-8')
print(page_info)
可以通过add_header(key, value) 或者直接以参数的形式和URL一起请求访问,urllib.request.Request()
urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)
三 爬虫利器Beautiful Soup
Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.
文档中的例子其实说的已经比较清楚了,那下面就以爬取简书首页文章的标题一段代码来演示一下:
先来看简书首页的源代码:
可以发现简书首页文章的标题都是在<a/>标签中,并且class='title',所以,通过
find_all('a', 'title')
便可获得所有的文章标题,具体实现代码及结果如下:
# -*- coding:utf-8 -*-
from urllib import request
from bs4 import BeautifulSoup
url = r'http://www.jianshu.com'
# 模拟真实浏览器进行访问
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
page = request.Request(url, headers=headers)
page_info = request.urlopen(page).read()
page_info = page_info.decode('utf-8')
# 将获取到的内容转换成BeautifulSoup格式,并将html.parser作为解析器
soup = BeautifulSoup(page_info, 'html.parser')
# 以格式化的形式打印html
# print(soup.prettify())
titles = soup.find_all('a', 'title') # 查找所有a标签中class='title'的语句
# 打印查找到的每一个a标签的string
for title in titles:
print(title.string)
Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,下表列出了主要的解析器,以及它们的优缺点:
四 将爬取的信息存储到本地
之前我们都是将爬取的数据直接打印到了控制台上,这样显然不利于我们对数据的分析利用,也不利于保存,所以现在就来看一下如何将爬取的数据存储到本地硬盘。
1 对.txt文件的操作
读写文件是最常见的操作之一,python3 内置了读写文件的函数:open
open(file, mode='r', buffering=-1, encoding=None, errors=None,newline=None, closefd=True, opener=None))Open file and return a corresponding file object. If the file cannot be opened, an OSErroris raised.
其中比较常用的参数为file和mode,参数file为文件的路径,参数mode为操作文件的方式(读/写),函数的返回值为一个file对象,如果文件操作出现异常的话,则会抛出 一个OSError
还以简书首页文章题目为例,将爬取到的文章标题存放到一个.txt文件中,具体代码如下:
# -*- coding:utf-8 -*-
from urllib import request
from bs4 import BeautifulSoup
url = r'http://www.jianshu.com'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
page = request.Request(url, headers=headers)
page_info = request.urlopen(page).read().decode('utf-8')
soup = BeautifulSoup(page_info, 'html.parser')
titles = soup.find_all('a', 'title')
try:
# 在E盘以只写的方式打开/创建一个名为 titles 的txt文件
file = open(r'E:itles.txt', 'w')
for title in titles:
# 将爬去到的文章题目写入txt中
file.write(title.string + '
')
finally:
if file:
# 关闭文件(很重要)
file.close()
open中mode参数的含义见下表:
其中't'为默认模式,'r'相当于'rt',符号可以叠加使用,像'r+b'
另外,对文件操作一定要注意的一点是:打开的文件一定要关闭,否则会占用相当大的系统资源,所以对文件的操作最好使用try:...finally:...的形式。但是try:...finally:...的形式会使代码显得比较杂乱,所幸python中的with语句可以帮我们自动调用close()而不需要我们写出来,所以,上面代码中的try:...finally:...可使用下面的with语句来代替:
with open(r'E:itle.txt', 'w') as file:
for title in titles:
file.write(title.string + '
')
效果是一样的,建议使用with语句
2 图片的储存
有时候我们的爬虫不一定只是爬取文本数据,也会爬取一些图片,下面就来看怎么将爬取的图片存到本地磁盘。
我们先来选好目标,知乎话题:女生怎么健身锻造好身材? (单纯因为图多,不要多想哦 (# _ # ) )
看下页面的源代码,找到话题下图片链接的格式,如图:
可以看到,图片在img标签中,且class=origin_image zh-lightbox-thumb,而且链接是由.jpg结尾,我们便可以用Beautiful Soup结合正则表达式的方式来提取所有链接,如下:
links = soup.find_all('img', "origin_image zh-lightbox-thumb",src=re.compile(r'.jpg$'))
提取出所有链接后,使用request.urlretrieve来将所有链接保存到本地
Copy a network object denoted by a URL to a local file. If the URL points to a local file, the object will not be copied unless filename is supplied. Return a tuple (filename, headers)where filename is the local file name under which the object can be found, and headers is whatever the info()method of the object returned by urlopen()returned (for a remote object). Exceptions are the same as for urlopen().
具体实现代码如下:
# -*- coding:utf-8 -*-
import time
from urllib import request
from bs4 import BeautifulSoup
import re
url = r'https://www.zhihu.com/question/22918070'
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
page = request.Request(url, headers=headers)
page_info = request.urlopen(page).read().decode('utf-8')
soup = BeautifulSoup(page_info, 'html.parser')
# Beautiful Soup和正则表达式结合,提取出所有图片的链接(img标签中,class=**,以.jpg结尾的链接)
links = soup.find_all('img', "origin_image zh-lightbox-thumb",src=re.compile(r'.jpg$'))
# 设置保存的路径,否则会保存到程序当前路径
local_path = r'E:Pic'
for link in links:
print(link.attrs['src'])
# 保存链接并命名,time防止命名冲突
request.urlretrieve(link.attrs['src'], local_path+r'%s.jpg' % time.time())
运行结果
注意营养哦~~~
一入爬虫深似海,从此游戏是路人!总结我的python爬虫学习笔记相关推荐
- 一入IT深似海 从此妹子为路人
一入IT深似海,从此妹子为路人.....传者网的那个什么 在我还不知道程序员是什么的时候就选择了编程这条道路,直到现在我不得不说,程序对我吸引真的很大,我喜欢写代码,因为能给人带来成就感.记得当年老师 ...
- 一入侯门深似海,从此萧郎是路人
<赠婢> 唐:崔郊 公子王孙逐后尘,绿珠垂泪滴罗巾. 一入侯门深似海,从此萧郎是路人. 诗的首两句应该换个顺序翻译,绿珠是美女佳人的代称,泛指容貌姣好的女子,可是这么美丽的女子却在偷偷的哭 ...
- 一入编码深似海,在达观数据做程序员是怎样一种体验?
在技术浪潮一波接一波推动人类社会前进的历史进程当中,程序员始终是站在浪尖的群体.2014年起,把每年10月24日(2^10)定义为程序员节.这可能是唯一一个与数字紧密相关的节日--也体现了这个节日的含 ...
- 您为了什么而学?【一入红尘深似海 勿负天下有心人】
踏入凡尘皆天意,何论成败论英雄.徒步跌撞几十载,辗转功成犹可期. 莫问天下谁有心,功臻造化皆回首.以往征途一心否,成负天下不负君. 世间本就无难事,唯有敢于攀登者.纸上谈兵不可为,欲成由心是为谁? 坎 ...
- 「一入 Java 深似海 」系列课程
第一期 「一入 Java 深似海 」系列课程 - 第一期 第一节:Java 语言基础 转载于:https://www.cnblogs.com/wangjunwei/p/10393306.html
- Java实现小猪佩奇_一入java深似海(1-4期 完整版)
『课程目录』: ├─第1期 │ 开篇 一入 Java 深似?,从此"劝退"成必然.mp4 │ 第1节:Java语言基础.mp4 │ 第2节:Java面 ...
- 一入Java 深似海
「一入 Java 深似海 」系列是小马哥 2019 年在 SegmentFault 平台发布的全新付费课程,内容围绕 Java 生态体系而展开,从编程语言.编程模型.代码设计,框架实现以及架构实践等, ...
- 数赢云CTO『朱炜』丨一入创业深似海……
关注"Ai时速" 智慧赢未来! Ai时速 因着Ai的美好:用激情和速度体验Ai时代! 职业创业|PK分享|进化成长 朱炜 写在前面 " 生命在于折腾,技术改变未来! ...
- 一入爬虫深似海,从此“节操”是路人!熬夜总结的python爬虫资料
Python爬虫这个词出现在生活中的频率真是越来越高,那你知道Python爬虫都可以做什么吗?那今天我带大家了解一下Python爬虫可以做什么. Python爬虫就是网络爬虫,通俗的讲就是通过程序去获 ...
- 一入爬虫深似海,反爬技术你知多少?
文章目录 1. 习惯性唠叨点啥 2. 什么造就了爬虫 3. 为什么要反爬虫 4. 反反爬虫的权重 5. 高级的反爬手段 6. 爬虫的发展方向 7. 致谢 1. 习惯性唠叨点啥 最近很久一段时间没有 ...
最新文章
- 亚马逊新品流量是上架开始算吗?
- ffmpeg源码分析四:transcode_step函数 (转4)
- Codeforces Round #168 (Div. 2)---A. Lights Out
- 大话数据结构 17:图的深度优先遍历和广度优先遍历
- [超享]linux共享3160命令
- 2019-03-06-算法-进化(三数之和)
- 金山网络CEO傅盛:简约之美
- redis单节点安装
- 项目评测(共27组)
- python批量提取哔哩哔哩bilibili视频
- JavaScript 中的异步:Event Loop 及其他
- Trime同文输入法
- Tomcat配置参数优化
- Andriod 第三方 ROM
- 虚幻4 游戏引擎 C++编程 官网例程解析
- 一副好的平面设计作品,来自优秀的字体
- Attention-Based Recurrent Neural Network Models for Joint Intent Detection and Slot Filling论文笔记
- LaTex入门【记录】
- 汇编跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等
- 十分钟带你了解阿里、美团、滴滴、头条等互联网头部大厂面经
热门文章
- hive map格式转换为字符串_Hive学习之Hive数据类型 | 学步园
- 浅谈JS中常见的问题(三)
- 鸿蒙记 四十四,书画装裱谨记的四十个小窍门
- 企业工程项目管理系统源码-专注项目数字化管理-Java工程管理-二次开发
- Shell 实现企业微信通知
- 信号量解决男女共浴问题
- PostgreSQL函数for循环使用
- CSDN博客图片自定义及去除水印方法
- 今日头条安卓_定了!今日头条社交新品叫“多闪”,主打视频社交,对攻微信!...
- python numba_python加速模块numba的用法