Python上手很容易,免费开源,跨平台不受限制,面向对象,框架和库很丰富。

Python :Monty Python's Flying Circus (Python的名字来源,和蟒蛇其实无关)。

通过homebrew和pyenv可以维护多个Python版本。

相关知识

HTTP = HyperText Transfer Protocol

URI = Uniform Resource Identifier 强调资源

URL = Uniform Resource Locator 强调资源的位置

可以说url是一种具体的uri,uri是一个抽象的概念,即url标志一个uri,并指明了位置。

所谓web api,就是通过Http请求实现。

Head:向服务器索要与get请求相一致的相应,响应不会被返回。

GET:向特定资源发出请求。

PUT:向指定资源位置上传最新内容。

POST:向指定资源提交数据进行处理请求。

DELETE:删除指定URI所标识的资源。

PATCH:修改某一资源。

基本上使用就是GET和POST。

# -*- coding: UTF-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import requests
import json
# # get url = 'http://kaoshi.edu.sina.com.cn/college/scorelist?tab=batch&wl=1&local=2&batch=&syear=2013' request = requests.get(url = url) #请求
request.encoding = 'utf-8' #防止乱码
print request.text #读取 #post
data = {'type1': 1, 'type2': 2, 'status': 0, 'wdzjPlatId': 59}
request = requests.post('http://shuju.wdzj.com/depth-data.html',data = data)
for key in json.loads(request.text).keys(): # json.loads把json格式的数据转成字典
print key #下面有简单提到json,当然json本身不是复杂东西,详细的可以自己搜索

requests包很好用,以前写爬虫都是urllib2,这玩意很啰嗦,所以我还是推荐用requests,http://docs.python-requests.org/zh_CN/latest/user/quickstart.html#id3

HTTP常见状态码:

200:OK

404:找不到资源

1开头的是消息,2开头的是成功,3开头的是重定向,4开头的是请求错误。

http://baike.baidu.com/link?url=A3GlzlRhQ8uaIQwuj09hBF_n9z3pCnwwbGNVaMHZ4GRXUteDmtbCxzkR5vCDk7Yp--B5bg4wIlQUO-5rfm55ff5uzTclboD2eOtjFPe69w4nnPzu2tZ2RIJAUlqxWXtU

import requests
url = 'http://www.baidu.com'
r = requests.get(url)
print r.status_code 200

  

HTML

HTML,标记语言,不是编程语言。XML和HTML格式差不多的。

<标签 属性 = "属性的值"> </标签>

DOM文档模型

CSS(Cascading Style Sheets) 选择器: 样式定义如何显示html
  • 元素选择器 直接选择文档元素 比如head,p

  • 类选择器 元素的class属性,比如<h1 class="important"> 类名就是important .important选择所有有这个类属性的元素 可以结合元素选择器,比如p.important

  • ID选择器 元素的id属性,比如<h1 id="intro"> id就是important #intro用于选择id=intro的元素 可以结合元素选择器,比如p.important

  • 属性选择器 选择有某个属性的元素,而不论值是什么。 *[title] 选择所有包含title属性的元素 a[href]选择所有带有href属性的锚元素 还可以选择多个属性,比如:a[href][title],注意这里是要同时满足。 限定值:a[href="www.so.com"]

  • 此外还有后代,子元素选择器等

ID与类选择器的差异:ID一个文档只能出现一次 ID选择器不能使用单词列表 与类选择器一样,都区分大小写。

对于HTML,XML文件,可以使用XPath,但是XPath比较繁杂,不过可以通过浏览器的审查,然后选中你所要的目标,右击选中copy xpath来实现,也挺方便的。

Python中lxml库是实现XPath功能的,BeautifulSoup解析HTML文件,BeautifulSoup是基于DOM的,会载入整个文档,解析整个DOM树,因此时间和内存开销都会大很多。

而lxml只会局部遍历,另外lxml是用c写的,而BeautifulSoup是用python写的,因此性能方面自然会差很多。

当然这是以前,现在BeautifulSoup支持用lxml作为parser了,所以BeautifulSoup性能上也还算可以了。

http://beautifulsoup.readthedocs.io/zh_CN/latest/

此外python的爬虫框架Scrapy是建立在lxml库之上,当然当我们使用Scrapy的时候 BeautifulSoup也是可以的。

JSON

JSON,小,快,容易解析。所以当我们访问api时,获得的通常都是json格式的数据。

正则表达式

当BeautifulSoup都处理不了的数据,正则表达式是万能的,就是不断的匹配,匹配想要的内容。

正则表达式30分钟入门教程

最后存储

数据库:MySQl,SQLite,MongoDB,Redis,等等。

爬虫的简单介绍

工作流程:

将种子url放入队列,从队列中获取url,抓取内容,解析内容,将需进一步抓取的url放入工作队列,存储解析后的内容。

抓取策略:深度优先,广度优先,PageRank。

去重:Hash表,bloom过滤器。

Robots规范,网站通过Robots协议告诉搜索引擎哪些页面可以爬取,哪些不可以爬取。网站和爬虫的沟通方式,用来指导搜索引擎更好的爬取网站内容。

写一个基于深度的随机爬取wiki的简单例子:

from urllib2 import urlopen
from bs4 import BeautifulSoup
import re
pages = set()
def getLinks(pageUrl):
global pages
html = urlopen("http://en.wikipedia.org"+pageUrl)
bsObj = BeautifulSoup(html,'lxml')
try:
print(bsObj.h1.get_text())
print(bsObj.find(id="mw-content-text").findAll("p")[0])
print(bsObj.find(id="ca-edit").find("span").find("a").attrs['href'])
except AttributeError:
print("页面缺少一些属性!不过不用担心!")
for link in bsObj.findAll("a", href=re.compile("^(/wiki/)")):
if 'href' in link.attrs:
if link.attrs['href'] not in pages:
# 我们遇到了新页面
newPage = link.attrs['href']
print("----------------\n"+newPage)
pages.add(newPage)
getLinks(newPage)
getLinks("")

最新文章

  1. Javascript事件模型系列(二)事件的捕获-冒泡机制及事件委托机制
  2. webpack配置es6开发环境
  3. XP极限编程
  4. IOS 沙盒机制 &amp;&amp; 关于document\library\tmp的灵活使用
  5. PC-用Windows XP自带的组策略加固操作系统
  6. [翻译]Python with 语句
  7. theano中的concolutional_mlp.py学习
  8. 恢复sudo的权限的命令
  9. ASP.NET4.5Web API及非同步程序开发系列
  10. APUE读书笔记:关于sigsuspend
  11. 201521123023《Java程序设计》第12周学习总结
  12. (译文)开始学习Webpack-应用TypeScript,配置热加载和Source Map
  13. @ReponseBody返回的json中文乱码-遁地龙卷风
  14. 行盒(line box)垂直方向的属性详解:从font-size、line-height到vertical-align
  15. 移动端点击出现阴影 css解决方案
  16. 面试题之O(n)内旋转字符串
  17. Java中HashMap的实现原理
  18. java.lang.UnsupportedClassVersionError: org/hibernate/SessionFactory : Unsupported major.minor version 52.0
  19. 关于Controller层返回JSON字符串
  20. atcoder 2017Code festival C ——D题 Yet Another Palindrome Partitioning(思维+dp)

热门文章

  1. pip安装报错解决
  2. 管理lvm 卷 system-storage-manager
  3. 一个安卓应用 多少个 dalvik 虚拟机
  4. JZYZOJ1330 土地购买 dp 斜率优化
  5. LOJ2758 年轮蛋糕
  6. php操作redis出现不报错就退出
  7. C++继承引入的隐藏与重写
  8. js之iframe父、子页面通信
  9. Java获取服务器IP和客户端IP
  10. ionic开发环境搭建之ios