Python 爬虫(1)基础知识和简单爬虫
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开头的是请求错误。
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都处理不了的数据,正则表达式是万能的,就是不断的匹配,匹配想要的内容。
最后存储
数据库: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("")
Python 爬虫(1)基础知识和简单爬虫的更多相关文章
- Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现
Python进阶----计算机基础知识(操作系统多道技术),进程概念, 并发概念,并行概念,多进程实现 一丶进程基础知识 什么是程序: 程序就是一堆文件 什么是进程: 进程就是一个正在 ...
- Python开发(一):Python介绍与基础知识
Python开发(一):Python介绍与基础知识 本次内容 一:Python介绍: 二:Python是一门什么语言 三:Python:安装 四:第一个程序 “Hello world” 五:Pytho ...
- 基于Python的Flask基础知识
Flask简介 Flask 是一个使用 Python 编写的轻量级 Web 应用程序框架.Armin Ronacher带领一个名为Pocco的国际Python爱好者团队开发了Flask. 下面我们简单 ...
- 3D开发基础知识和简单示例
引言 现在物联网概念这么火,如果监控的信息能够实时在手机的客服端中以3D形式展示给我们,那种体验大家可以发挥自己的想象. 那生活中我们还有很多地方用到这些,如上图所示的Kinect 在医疗上的应用,当 ...
- Python第一章-基础知识
第一章:基础知识 1.1 安装python. 直接官网下载最新的python然后默认安装就可以了,然后开始菜单里找到pyhton *.*.* Shell.exe运行python的交互shell ...
- Python音频处理基础知识,这不是轻轻松松~~~
大家好鸭,我是小熊猫 咱今天来讲一讲音频处理的基础知识上才艺~~~ 1.声音的基础 2.python读取.wav音频 欢迎加入白嫖Q群:660193417### import wave import ...
- python这不是有手就行?——python音频处理基础知识
大家应该都知道声音的基础吧? 啊不知道当我没说吧~~~ 1.声音的基础 2.python读取.wav音频 Python学习交流Q群:660193417#### import wave import s ...
- scrapy基础知识之 关于爬虫部分一些建议:
1.尽量减少请求次数,能抓列表页就不抓详情页,减轻服务器压力,程序员都是混口饭吃不容易. 2.不要只看 Web 网站,还有手机 App 和 H5,这样的反爬虫措施一般比较少. 3.实际应用时候,一般防 ...
- scrapy基础知识之防止爬虫被反的几个策略::
动态设置User-Agent(随机切换User-Agent,模拟不同用户的浏览器信息) 禁用Cookies(也就是不启用cookies middleware,不向Server发送cookies,有些网 ...
随机推荐
- 【LOJ】#2012. 「SCOI2016」背单词
题解 我们发现第一种操作肯定不可取,每个节点里它最近的点是它最长出现过的后缀,发现这就是AC自动机的fail节点,根据fail的关系这会是一棵树,而一个单词的前一个序号最大的后缀必定是它的父亲 然后我 ...
- Visual Studio2017如何设置自动生成的代码不换行
- 洛谷P4782 【模板】2-SAT问题 [2-SAT]
题目传送门 [模板]2-SAT问题 题目背景 2-SAT 问题 模板 题目描述 有n个布尔变量 $x_1/~x_n$ ,另有$m$个需要满足的条件,每个条件的形式都是“ $x_i$ 为$true/f ...
- Python函数-闭包的概念
一个函数和它的环境变量合在一起,就构成了一个闭包(closure).在Python中,所谓的闭包是一个包含有环境变量取值的函数对象.环境变量取值被保存在函数对象的__closure__属性中.比如下面 ...
- 【搜索】还是N皇后
先看题才是最重要的: 这道题有点难理解,毕竟Code speaks louder than words,所以先亮代码后说话: #include<iostream> using namesp ...
- redis_NoSql入门概述数据模型简介
以下面的背景去对比关系型数据库和非关系型数据库的差异(一个电商客户.订单.订购.地址模型来对比以下关系型数据库和非关系型数据库) 传统数据库一般设计会使用ER图(1:1/1:N/N:N,主键等) 而N ...
- java 线程 wait join sleep yield notify notifyall synchronized
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 休息方法 : 在指定时间内 让该线程 暂停, 不会释放 锁标志. 等待方法: 让 该 线 ...
- POJ3687 Katu Puzzle
好好写2-sat 如果a1-->b1矛盾则连边a1-->b2和b1-->a2 我定了一个ccnt和cnt变量,结果少打一个c,wa了好多次(lll¬ω¬) By:大奕哥 #inclu ...
- BZOJ4551 HEOI2016树
可以用并查集,记忆化搜索,线段树多种方法实现. 我这里写的是依照dfs序建线段树,维护区间最大值. #include<bits/stdc++.h> using namespace std; ...
- 「ZJOI2018」历史
「ZJOI2018」历史 前置知识 \(\text{LCT}\) 维护子树信息,考虑辅助树上一个节点的子树信息只是其代表的这一段链的信息,设 \(S(u)\) 为节点 \(u\) 的子树信息,那么在辅 ...