咱们使用Python2.7进行开发,注意配置好环境变量。html
咱们使用Pycharm进行开发,它和大名鼎鼎的Android Studio、IDEA同出一门——Jet Brains。python
关于破解,很无耻的贴两个:android
用户名: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的一个第三方网络请求库。nginx
但因为有些比较奇怪的缘由,致使这个下载过程异常艰辛,因此咱们常常须要使用这样一个网站来帮助咱们下载:web
http://www.lfd.uci.edu/~gohlke/pythonlibs/正则表达式
这里面镜像收集了几乎全部的Python第三方库,咱们搜索Requests,点击下载。服务器
下载完毕后,更改后缀名为zip。并将解压出的Requests文件夹放到Python的Lib文件夹下。网络
直接使用Requests库的get方法获取网页源代码:app
import requests html = requests.get('http://www.hujiang.com/') print(html.text)
在终端中,咱们就能够看见生成的网页源代码了。eclipse
可是,不少网站并不会轻松的让爬虫获取到网页信息,这时候,咱们就须要经过修改Http头信息的方式来获取。·
<html> <head><title>403 Forbidden</title></head> <body bgcolor="white"> <center><h1>403 Forbidden</h1></center> <hr><center>nginx</center> </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/
咱们再运行,如今就能够正常获取源代码了。
直接get出来的内容,都是网页的全部源代码,这确定不是咱们须要的,因此,咱们能够经过正则表达式来提取咱们所须要的内容。
例如,咱们想提取网页中的全部超连接,OK,咱们来看如何实现:
首先咱们须要引入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('<a target="_blank" href="(.*?)"', html.text, re.S) for each in href: print each
他们的区别以下所示:
- Get是从服务器上获取数据
- Post是向服务器传送数据
- Get经过构造url中的参数来实现功能
- Post将数据放在header提交数据
Chrome调试功能——Network调试
在Network中找到Post提交的地方,找到Form Data,这就是表单数据。
Post方式提交表单。
import requests import re url = 'https://www.crowdfunder.com/browse/deals&template=false' data = { 'entities_only':'true', 'page':'2' } html_post = requests.post(url,data=data) title = re.findall('"card-title">(.*?)</div>',html_post.text,re.S) for each in title: print eachXPath
XPath,就是XML路径语言,咱们在寻找一个元素时,若是使用正则表达式,能够这么说,我要找一个长头发、180cm的女人。那么若是要用XPath来表达,就是XX公司XX部门的前台。
在Python中使用XPath,咱们须要使用第三方模块lxml,安装如同Requests。
打开Chrome的审核元素,咱们找到任何一个元素,点击右键,选择copy XPath便可。
固然,咱们也能够手写,它的基本语法以下:
好比咱们选择这个地址:http://www.imooc.com/course/list?c=android&page=2
打开审核元素:
这样咱们就很是方便的得到了元素的XPath,同时,咱们也能够根据规则来手动修改。
使用XPath基本是以下三个步骤:
咱们一样之前面的网址为例,咱们抓取所选的那门课程的标题:
# coding=utf-8 import requests from 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,返回的就是一个列表,就是咱们要的全部元素,这里就不详细演示了。
例如:
<div id="test-1">须要的内容1</div> <div id="test-2">须要的内容2</div> <div id="test-3">须要的内容3</div>
咱们须要提早全部内容,可是他们的属性都不一样,咱们先看下一个元素的XPath:
//*[@id="test-1"]/text()
可见,ID决定了元素,因此要取出这样的元素时,咱们须要使用XPath的starts-with(@属性名称, 属性字符相同部分)方法:
//*[starts-with(@id,"test")]/text()
只须要将[]中的内容使用starts-with方法进行匹配就OK了。
例如:
<div id=“class”>text1 <font color=red>text2</font> text3 </div>
相似这种嵌套标签的,若是咱们使用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。
·