天罗地网——Python爬虫初初初探
Python
我们使用Python2.7进行开发,注意配置好环境变量。
IDE
我们使用Pycharm进行开发,它和大名鼎鼎的Android Studio、IDEA同出一门——Jet Brains。
关于破解,很无耻的贴两个:
用户名:yueting3527 注册码:===== LICENSE BEGIN =====93347-12042010 00001FMHemWIs"6wozMZnat3IgXKXJ 2!nV2I6kSO48hgGLa9JNgjQ5oKz1Us FFR8k"nGzJHzjQT6IBG!1fbQZn9!Vi===== LICENSE END =====
用户名:yueting3527 注册码:===== LICENSE BEGIN =====93347-12042010 00001FMHemWIs"6wozMZnat3IgXKXJ 2!nV2I6kSO48hgGLa9JNgjQ5oKz1Us FFR8k"nGzJHzjQT6IBG!1fbQZn9!Vi===== LICENSE END =====Requests模块
Requests模块是一个用于替代Python URLLib2的一个第三方网络请求库。
安装
- Windows:pip install requests
- Linux & Mac:sudo pip install requests
但由于有些比较奇怪的原因,导致这个下载过程异常艰辛,所以我们经常需要使用这样一个网站来帮助我们下载:
http://www.lfd.uci.edu/~gohlke/pythonlibs/
这里面镜像收集了几乎所有的Python第三方库,我们搜索Requests,点击下载。
下载完毕后,更改后缀名为zip。并将解压出的Requests文件夹放到Python的Lib文件夹下。
通过Requests获取网页源代码
无反爬虫机制
直接使用Requests库的get方法获取网页源代码:
import requests html = requests.get('http://www.hujiang.com/') print(html.text)
在终端中,我们就可以看见生成的网页源代码了。
有反爬虫机制
但是,很多网站并不会轻松的让爬虫获取到网页信息,这时候,我们就需要通过修改Http头信息的方式来获取。
例如我们使用同样的代码去爬我的博客 http://blog.csdn.net/eclipsexys 在终端中,我们可以看见这样一段话:
<html><head><title>403 Forbiddentitle>head><body bgcolor="white"><center><h1>403 Forbiddenh1>center><hr><center>nginxcenter>body>html>
403,这时候,我们就需要修改下爬虫代码。
首先,我们在页面上点击右键选择审查元素,找到Network,刷新下, 选择任意一个元素,找到最后的User—Agent:
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36
这就是我们的Http请求头。现在我们修改代码:
import requests head = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'} html = requests.get('http://blog.csdn.net/eclipsexys', headers = head) print(html.text.encode('utf-8'))
添加请求头,并设置下编码格式为UTF-8。(Windows下默认为GBK,请先修改coding为UTF-8)
ps: 在Python文件中,如果我们要输入中文,需要指定下文件的字符集:
# coding=utf-8
具体见 https://www.python.org/dev/peps/pep-0263/
我们再运行,现在就可以正常获取源代码了。
Requests正则搜索
直接get出来的内容,都是网页的所有源代码,这肯定不是我们需要的,所以,我们可以通过正则表达式来提取我们所需要的内容。
例如,我们想提取网页中的所有超链接,OK,我们来看如何实现:
re模块
首先我们需要引入re模块,re模块是正则表达式的模块,使用与web端的正则一样:
import requests import re head = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36'} html = requests.get('http://www.hujiang.com/', headers=head) html.encoding = "utf-8"href = re.findall('(.*?)
',html_post.text,re.S)for each in title: print each
XPathXPath,就是XML路径语言,我们在寻找一个元素时,如果使用正则表达式,可以这么说,我要找一个长头发、180cm的女人。那么如果要用XPath来表达,就是XX公司XX部门的前台。
lxml
在Python中使用XPath,我们需要使用第三方模块lxml,安装如同Requests。
获取HTML的XPath路径
打开Chrome的审核元素,我们找到任何一个元素,点击右键,选择copy XPath即可。
当然,我们也可以手写,它的基本语法如下:
- //定位根节点
- /往下层寻找
- 提取文本内容:/text()
- 提取属性内容: /@xxxx
比如我们选择这个地址:http://www.imooc.com/course/list?c=android&page=2
打开审核元素:
这样我们就非常方便的获得了元素的XPath,同时,我们也可以根据规则来手动修改。
爬取内容
使用XPath基本是如下三个步骤:
- from lxml import etree
- Selector = etree.HTML(HTML Source)
- Selector.xpath(XPath)
我们同样以前面的网址为例,我们抓取所选的那门课程的标题:
# coding=utf-8import requestsfrom lxml import etree html = requests.get("http://www.imooc.com/course/list?c=android&page=2") html.encoding = 'utf-8'selector = etree.HTML(html.text) content = selector.xpath('//*[@id="main"]/div/div/div[3]/div[1]/ul/li[1]/a/h5/span/text()')for each in content: print each
这样我们就获取了对应的内容, 搜索方法,其实跟我们通过地址来定位是一样的,中国-上海-浦东新区(内容唯一时,前面可跳过)-张江高科-沪江网-徐宜生
那么如果我们需要爬取所有的课程信息要怎么办呢?我们可以看见生成的XPath中,有一个li[1],它对应的是我们源代码中的那个列表,我们选择1是因为选择具体的一项,如果我们去掉这个1,返回的就是一个列表,就是我们要的所有元素,这里就不详细演示了。
XPath高级使用技巧
相同字符串开头、但属性不同
例如:
<div id="test-1">需要的内容1div> <div id="test-2">需要的内容2div> <div id="test-3">需要的内容3div>
我们需要提前所有内容,但是他们的属性都不同,我们先看下一个元素的XPath:
//*[@id="test-1"]/text()
可见,ID决定了元素,所以要取出这样的元素时,我们需要使用XPath的starts-with(@属性名称, 属性字符相同部分)方法:
//*[starts-with(@id,"test")]/text()
只需要将[]中的内容使用starts-with方法进行匹配就OK了。
嵌套标签
例如:
<div id=“class”>text1 <font color=red>text2font> text3div>
类似这种嵌套标签的,如果我们使用XPath获取第一级的text,那么只能获取text1和text3,如果要获取text2,我们就需要使用string(.)方法。
data = selector.xpath('//div[@id="class"]')[0]info = data.xpath('string(.)') content = info.replace('\n','').replace(' ','') print content
通过string(.),我们可以获取嵌套标签的text,相当于遍历子标签,获取text。
最后写本篇博客的目的在于后面要进行的一次抽奖活动,大家都知道,我的新书《Android群英传》已经正式上市了,为了报答各位的大力推荐,我准备在CSDN博客准备一次抽奖,这篇博客所讲的,自然是抽奖所需要的预备知识,欢迎大家预热~~~
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
python—android编译中build_image.py分析
最近在学习python,基础知识学习了一遍。我的学习习惯是:了解了基础语法后,去阅读开源代码(掌握优秀程序员的一些写代码习惯和手法),最后结合项目实践,实践的过程对某些细节进行深化。 想起android编译系统中有一些python脚本,下面对build_image.py进行简单分析。编译系统中调用build_image.py 生成系统镜像的target在build\core\Makefile中, #----------build\core\Makefile-------------#$(1):outputfiledefinebuild-systemimage-target@echo"Targetsystemfsimage:$(1)" @mkdir-p$(dir$(1))$(systemimage_intermediates)&&rm-rf$(systemimage_intermediates)/system_image_info.txt$(callgenerate-userimage-prop-dictionary,$(systemimage_intermediates...
- 下一篇
20210519 文件读与写详解
文件操作流程: 1. 打开文件,得到文件句柄并赋值给一个变量 2. 通过句柄对文件进行操作 3. 关闭文件 1-1 打开文件 data = open("donotcry",encoding = "utf-8").read() print(data) --> Talk to me softly. There is something in your eyes …… Tonight # python 默认编码 是 utf-8;如果打开不指定,windows 默认用 gbk 打开 # 不是同一个编码,所以必须告诉程序,用 utf-8 打开 # 文件打开后,后续如果要操作,需要通过打开的文件对象操作 # 如果想把文件打开后进行更多的操作,必须把打开的文件对象赋一个变量 1-2 操作文件 f = open("donotcry",encoding = "utf-8") # 文件句柄 # 文件句柄就是这个文件的内存对象,句柄里面包含文件的文件名,字符集,大小,内存,硬盘上的起始位置等 data = f.read() data2 = f.read() print(data) --> Tal...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2全家桶,快速入门学习开发网站教程
- Mario游戏-低调大师作品
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7