tensorflow精进之路(十七)——python3网络爬虫(上)
1.概述
在继续学习tensorflow之前,我想先写一下python爬虫的内容,作为深度学习的一个技能补充。深度学习需要用到大量的训练数据,没有爬虫靠人工下载,工作量不敢想象。学会爬虫就可以去爬一些收集训练数据需要(或喜欢)的网站了。如果想深入学习爬虫,推荐这本书《精通Python网络爬虫+核心技术、框架与项目实战》
2、Urllib库
Urllib库是python的一个用于操作URL的库,Python2.X中分为Urllib库和Urllib2库,Python3.X之后将其合并到Urllib库。这一节用的是Python3.5.
2.1、使用Urllib爬取网页
使用Urllib爬取网页很简单,首先导入Urllib模块,
import urllib.request as ur
然后用urllib.request.urlopen打开并爬取一个网页,
urlfile = ur.urlopen("http://www.baidu.com")
再用read将网页内容读取出来,然后,打印看看,
data = urlfile.read()
print(data)
运行结果:
当然也可以用readline函数只读取一行的内容,就不演示了。
如果想将爬取的网页保存到本地文件,那么先open一个本地文件,再write数据,最后close关闭文件即可,代码如下。
fd = open("baidu.html", "wb")
fd.write(data)
fd.close()
运行以后,发现本地多了个baidu.html文件,用浏览器运行,得到界面如下,
就这么简单的将百度首页爬取到了本地,只是没将图片爬取到本地而已。
Urllib库还提供了一个直接将网页写入本地文件的方法urllib.request.urlretrieve函数,代码如下:
ur.urlretrieve("https://blog.csdn.net/Aidam",filename="Aidam.html")
Urllib的其他用法这里就不一一介绍了,自己百度吧。
2.2、模拟浏览器访问
如果只用上面的方法去访问网页,有些网页为了防止恶意爬虫会进行一些反爬虫设置,就会返回403错误。为了避免这个错误,我们可以设置一些Headers信息,模拟成浏览器去访问这些网站。
打开浏览器的开发者工具(F12键),点击“Network”,
然后打开任意网站(比如百度),可以看到工具窗口出现一些数据,
点击任意一个数据,看到右边出现一个窗口,Headers标签就是头信息,将右边窗口往下滚动,可以找到“User-Agent”标签,
这个就是模拟浏览器访问需要用到的信息,将其复制下来,得到信息:Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0
可以用两种方法将我们的爬虫模拟成浏览器访问。
方法一:使用build_opener()修改报头
urlopen不支持一些HTTP高级功能,可以使用urllib.request.build_opener,代码如下,
#encoding:utf-8
import urllib.request as ur
url = "https://blog.csdn.net/rookie_wei"
headers = ("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0")
opener = ur.build_opener()
opener.addheaders = [headers]
data = opener.open(url).read()
print(data)
运行结果跟上面的一样。
方法二:使用add_header()添加报头
直接上代码,
#encoding:utf-8
import urllib.request as ur
url = "https://blog.csdn.net/rookie_wei"
req = ur.Request(url)
req.add_header("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:59.0) Gecko/20100101 Firefox/59.0")data = ur.urlopen(req).read()
print(data)
运行结果跟上面的一样。
2.3、设置超时时间
有时候访问一个网页,如果网页长时间未相应,那么系统就会判断该网页超时,即无法打开网页。有时候我们需要自己设置超时的时间值,方法很简单,在使用urlopen时,设置timeout的值即可,单位是秒。例如,
urlfile = ur.urlopen("https://blog.csdn.net/rookie_wei", timeout=30)
2.4、使用代理服务器
有时候使用同一个IP高频地去爬取同一个网站,久了之后,可能会被网站的服务器屏蔽,解决这个问题的方法就是使用代理服务器去访问。使用代理服务器去爬取网站时,对方网站显示的是代理服务器的IP地址,即使这个地址被屏蔽了,我们换个代理就是了。
下面的网站提供了很多代理服务器的地址,
http://www.xicidaili.com/
有了代理服务器,下面就可以上示例代码了,
#encoding:utf-8
import urllib.request as urdef use_proxy(proxy_addr, url):proxy = ur.ProxyHandler({'http':proxy_addr})opener = ur.build_opener(proxy, ur.HTTPHandler)ur.install_opener(opener)data = ur.urlopen(url, timeout=30).read().decode('utf-8')return dataproxy_addr = '121.196.218.197:3128'
data = use_proxy(proxy_addr, 'https://blog.csdn.net/Aidam')
print(data)
如果有些代理不能用了,换一个就是了。
2.5、异常处理
程序在执行过程中难免发生异常,如果不处理,有可能导致整个程序异常退出。python的异常处理也是使用try...except语句,在try中执行主要代码,在except中捕获异常信息,并进行相应处理。这个比较简单,我就不详细讲了,但是这个内容还是很重要的,直接上个例子吧。
#encoding:utf-8
import urllib.request as ur
import urllib.error as ue
try:ur.urlopen('https://blog.csdn.net/rookie_weia')
except ue.URLError as e:print('我出现异常啦!')print(e.code)print(e.reason)
运行结果:
我故意访问一个不存在的网址,可以看到发生异常后,程序会执行except里的代码。
3、正则表达式
正则表达式在爬虫中很重要。正则表达式就是描述字符串排列的一套规则,比如,我们想找出一个网页中所有图片,其他的信息过滤掉,那么就观察图片的格式,然后写一个正则表达式来表示所有的图片,等等。
3.1、原子:
原子是正则表达式最基本的组成单元,每个正则表达式中至少要包含一个原子。常见的原子分为普通字符作为原子、非打印字符作为原子、通用字符作为原子、原子表。下面就来分别讲解。
(1)普通字符作为原子
普通字符,即数字、大小写字母、下划线等,例如将”wei”作为原子使用,这这里有三个原子,分别是”w”、”e”、”i”,举个示例。代码如下,
import re
pattern = 'wei'
str = '_wei'
result = re.search(pattern, str)
print(result)
运行结果:
python中使用正则表达式需要用到re模块,pattern变量定义了正则表达式的值,然后使用re模块的search函数在str字符串里匹配对应的正则表达式,然后将结果返回给变量result。从打印结果可以看出,span表示匹配的位置,match表示匹配结果。如果匹配失败,则返回None,可以将字符串改为str = '_wedi'输出结果为,
(2)非打印字符作为原子
非打印字符作为原子指的是一些在字符串中用于格式控制的符号,如换行符”\n”等。
(3)通用字符作为原子
通用字符作为原子,即一个原子可以匹配一类字符。常见通用字符及其含义如下表所示,
例如,我们可以使用”\w\dwei\w”对”wei”字符匹配,则“12weia”、“w2wei_”都可以匹配成功。
(4)原子表
原子表可以定义一组地位平等的原子,然后匹配时会取该原子表中任意一个原子进行匹配,python中原子表用[]表示,例如[abc]就是一个原子表,假设我们定义正则表达式为”[abc]wei”,源字符串为”cweifang”,则用re.search函数匹配,匹配的结果就是“cwei”。如果源字符串为”wei”,则不匹配,返回None。
[^]则表示除了括号内的原子以外,都可以匹配,比如定义正则表达式为”[^abc]wei”,源字符串为”cweifang”,则不匹配,源字符串为”zwei”则匹配。
3.2、元字符
元字符,就是正则表达式中具有一些特殊含义的字符,比如重复N此前面的字符等,常见元字符如下表所示,
3.3、模式修正
模式修正,即可以在不改变正则表达式的情况下,通过模式修正符改变正则表达式的含义,从而实现一些匹配结果的调整等功能。
举个例子,
import re
pattern1 = 'wei'
pattern2 = 'wei'str = 'ahWeiqew'print(re.search(pattern1, str))
print(re.search(pattern2, str, re.I))
运行结果:
3.4、正则表达式常见函数
re.match函数:
该函数从源字符串的起始位置匹配一个模式,函数的格式为,
re.match(pattern, string, flags=0)
第一个参数是表达式,第二个参数是源字符,第三个参数是可选参数,代表对应的标志位,可以放模式修正等信息。示例代码如下,
import re
pattern1 = '.wei'
str = 'aWeiqew'
print(re.match(pattern1, str, re.I))
运行结果:
re.search函数:
re.search函数会扫描整个字符串进行匹配,而re.match函数从字符串开头进行匹配,它们用法是一样的。
re.compile和findall函数
前面介绍的两个函数,即使源字符串中含有多个匹配结果,也只会返回一个,而re.compile函数和findall函数的组合使用则可以将符合模式的内容全部匹配出来。示例代码如下,
import restr = 'aWeiqew8732weiadnwei2103_wei'
pattern = re.compile('.wei.')
print(pattern.findall(str))
运行结果:
4、多线程
使用多线程会使爬虫效率大大提高,比如在爬取图片的爬虫中,开启一个线程获取图片的url地址,一个线程进行下载,则比单个线程先获取图片url再下载的效率高很多。这里就简单介绍python的多线程。
import threadingclass A(threading.Thread):def __init__(self):threading.Thread.__init__(self)def run(self):for i in range(1000):print('我是线程A')class B(threading.Thread):def __init__(self):threading.Thread.__init__(self)def run(self):for i in range(1000):print('我是线程B')t1 = A()
t1.start()t2 = B()
t2.start()
运行结果:
总结:
这一节就先学习爬虫的一些最基本的知识,如果想深入学习的话,推荐我在概述里给的那本书。我的目的不是成为爬虫高手,只要满足爬取我需要的训练数据即可。讲了这么多屁话有什么用?下一节就来两个真实的爬虫示例,一个是爬取汽车之家的汽车厂商及车型,还有一个是在爬取百度图片中爬取我们想搜索的图片。学完之后,就可以爬一些喜欢的小网站的图片和视频了。
tensorflow精进之路(十七)——python3网络爬虫(上)相关推荐
- tensorflow精进之路(十八)——python3网络爬虫(中)
1.概述 上一节简单的介绍了一些python3网络爬虫的知识,这一节就运用上一节的知识写个小demo,用于爬去汽车之家网站的汽车厂商及车型名称. 2.打开待爬取网页 打开汽车之家官网, https:/ ...
- 《Python3网络爬虫开发实战(第二版)》内容介绍
这是「进击的Coder」的第 505 篇分享 作者:崔庆才 大家好,本节首先来预告下即将出版的<Python3网络爬虫开发实战(第二版)>的主要内容. 由于我已经把书的总体的内容介绍写在了 ...
- Python3 网络爬虫快速入门实战解析
点击上方"Python高校",关注 文末干货立马到手 作者:Jack Cui http://cuijiahua.com/blog/2017/10/spider_tutorial_1 ...
- [Python3网络爬虫开发实战] 7-动态渲染页面爬取-4-使用Selenium爬取淘宝商品
在前一章中,我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过Ajax获取的,但是这些Ajax接口参数比较复杂,可 ...
- 【Python3网络爬虫开发实战】3-基本库的使用 1.2-处理异常
前一节我们了解了请求的发送过程,但是在网络不好的情况下,如果出现了异常,该怎么办呢?这时如果不处理这些异常,程序很可能因报错而终止运行,所以异常处理还是十分有必要的. urllib的error模块定义 ...
- Python3网络爬虫快速入门实战解析(一小时入门 Python 3 网络爬虫)
Python3网络爬虫快速入门实战解析(一小时入门 Python 3 网络爬虫) https://blog.csdn.net/u012662731/article/details/78537432 出 ...
- 《Python3网络爬虫开发实战(第二版)》上市了!!!!
" 阅读本文大概需要 5 分钟. " 告诉大家一个好消息:我的好朋友崔庆才老师的<Python3网络爬虫开发实战(第二版)>现在正式上市了!!!! 没错,就是这本: 就 ...
- python3网络爬虫代码_《Python3网络爬虫开发实战代码》
<Python3网络爬虫开发实战代码>\appium\.git\COMMIT_EDITMSG, 7 , 2017-08-15 <Python3网络爬虫开发实战代码>\appiu ...
- 【Python3网络爬虫开发实战】4-解析库的使用-3 使用pyquery
在上一节中,我们介绍了Beautiful Soup的用法,它是一个非常强大的网页解析库,你是否觉得它的一些方法用起来有点不适应?有没有觉得它的CSS选择器的功能没有那么强大? 如果你对Web有所涉及, ...
最新文章
- matlab中textread 函数
- numpy.ones() 详解
- Netflix 如何使用机器学习来提升流媒体质量
- NormalMap 贴图 [转]
- alternatives命令使用方法
- 应该如何设计圣诞元素到项目?
- 采用Cloudera-Manager安装CDH时,采用内嵌数据库各数据库用户密码的保存位置
- [JavaEE] 了解Java连接池
- Chapter 1 Securing Your Server and Network(7):禁用SQL Server Browse
- 7000条短信接口!福利赠送!
- win7西捷硬盘测试软件,Seagate希捷SeaTools硬盘检测工具
- Loadrunner12实现手机APP压力测试
- KGB知识图谱的功能和特色介绍
- 汇编——dosbox的debug常用指令
- make编译源码时报error: ‘for’ loop initial declarations are only allowed in C99 mode的解决办法
- 微信公众平台开发:JS API支付
- 【NCRE】初遇 SQL SERVER 的 CASE WHEN
- STM32模拟读卡器,对于工控机方案谨防踩坑
- 常见的python连接数据库包
- 解决editplus编译出现中文乱码
热门文章
- Errors running builder #39;DeploymentBuilder#39; on project #39;工程名#39;
- 常用cmd命令(持续更新)
- linux 建立vnc,51CTO博客-专业IT技术博客创作平台-技术成就梦想
- 2021四川高考成绩位次查询,2021年四川高考位次查询及一分一段表排名查询
- xtrabackup备份mysql_xtrabackup备份mysql
- mysql-------视图
- SQL SERVER 系列(2)数据库的创建、修改和删除
- LeetCode简单题目(#160 #167 #168 #169 #171)-5道(序列、数字)
- imread函数_不知道这 7 大 OpenCV 函数怎么向计算机视觉专家进阶?
- TLS 1.3套件TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256