python爬虫学习计划 – Python量化投资

python爬虫学习计划

学习计划

学习原因

python在web方面的相关信息都是为了用而学,没有系统的学习过。学到的东西非常零碎不系统,或者小小的需求变化都可能导致无从下手。

目标

  • – 能够完成在任意网站采集任意数据。
  • – 模拟登录。
  • – 模拟提交数据,如网站自动发站内信(知乎啊,微博啊)。
  • – 医院预约号自动完成什么的。
  • – 其他待添加。
 


平台

python在上手时就是python3,而网上大多数教程都是py2.7的,没有办法,只要暂时切换到python2,尝试学习完毕后转移到python3上。

学前思考

先从最简单的不需要模拟登录、输入验证码之类的网站开始。然后由易到难,模拟登录,post提交啊、模拟浏览器、登录时提交数据,保存cookies、带cookies浏览神马的。

Let's GO!

尝试先从慕课网的python开发简单爬虫开始吧。以下就是笔记了:
python的网页下载器有哪些?

1. urllib2:Python官方的基础模块。能实现访问url、post提交、代理访问等等。
2. request:python第三方插件,功能更多。

教程中主要用到第一个模块。


初识urllib2


urllib2下载网页的方法有几种,

第一种是没有任何限制的最简洁的方法,直接访问法:

import urllib2

url = 'http://www.baidu.com'
# 不附加任何参数,直接打开
response = urllib2.urlopen(url)
# response.getcode方法是返回网页的状态码,成功为200,不存在则一般为404
print response.getcode()
# 读取下载好的网页内容
content = response.read()
print(content)

 

对第一种方法进行增强处理:
用urllib2的Request对象包装用户需要输入的对象data、头信息(header).

添加头信息的作用有很多,比如模拟成浏览器以防止某些网站拒绝非浏览器的访问。
然后就可以正常访问了:

import urllib2
request = urllib2.Request(url)
# 添加用户信息,如关键字为s,值为鲁能
#request.add_data('s':'鲁能') #依照教程输入,结果运行不过去,暂时注释掉。
# 添加头信息,将爬虫模拟为浏览器
request.add_header('user-agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) Chrome/48.0.2564.116')
# 这里是将request实例作为参数直接传入
response = urllib2.urlopen(request)
print(response.read())

 

第三种则是添加特殊的情景处理器

 

  • – HTTPCookiesProcessor: 用于某些需要用户登录才能访问的时候,需要添加cookies处理
  • – ProxyHandler: 用于需要代理才能访问的网页
  • – HTTPHandler: 用于网页协议是https加密的网页访问
  • – HTTPRedirectHandler: 用于有相互跳转关系的网页

 

以上工具是传递给urllib2的build_opener方法的,之后再用urllib2.install_opener方法为urllib2安装给其的工具。

最终就可以用正常的urlopen(url)或者urlopen(request)来正常访问了。

import urllib2, cookielib

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
response = urllib2.urlopen(url)
# response.getcode方法是返回网页的状态码,成功为200,不存在则一般为404
print response.getcode()
# 读取下载好的网页内容
content = response.read()
# 打印cookies数据
print cj
print content

网页解析器

什么是网页解析器?网页下载到本地后,需要对其解析,才能有针对性的提取有价值的数据。网页解析器就是用于提取有价值数据的工具。

python的常用解析器:

  1. 正则表达式:将网页内容当作一大个字符串,模糊匹配。
  2. html.parser:python模块。
  3. BeautifulSoup:第三方模块。既可以使用解析器2也可以用解析器4作为它的解析器。
  4. lxml

结构化解析

除了正则以外,2、3、4都是结构化解析(DOM)。
dom

详解BeautifulSoup中文文档,简称bs4):
在这里,我们主要使用bs4来进行结构化解析。
简单安装:
> pip install beautifulSoup4

我们得到网页内容后,即可开始创建bs4对象来提取有价值的网页内容了。其中,bs4支持find和find_all两种搜索方法,其参数一致。均用来搜索节点的名称、属性和文字。

beautifulSoup4用法结构图

beautifulSoup4节点示例说明

实例化bs4并传入相关参数后,即可开始检索相关内容。
>方法:find_all(names, attrs, string)


 

#查找所有标签为'a'的节点
soup.find_all('a')
#查找所有标签为a、链接符合/content/211.html形式的节点
soup.find_all('a', href='/content/211.html')
soup.find_all('a', href=*re.compile(r'/content/\d+\.html')*)# 支持正则
#查找所有标签为div class为eee,文字为python的节点
soup.find_all('div', class_='eee', string='python')
注:因为class为python关键字,故bs4将class节点改为class_

访问节点信息:
bs4_fangwen

一个示例:
这个例子中,实例化了bs4,并且以html.parser作为DOM解析器,指定编码为utf-8。
其中展示了正则方式应用。
 

# encoding:utf-8
from bs4 import BeautifulSoup
import re

html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>"""

soup = BeautifulSoup(html_doc, 'html.parser', from_encoding='utf-8')

# 获取所有连接
print u'所有连接'
links = soup.find_all('a')
print type(links)
for link in links:
    print link.name, link['href'], link['class'], link['id'] ,link.get_text()
    
    
# 获取elsie的连接
print u'elsie相关'
link_note = soup.find('a', href='http://example.com/elsie')
print link_note.name, link['href'], link_note['class'], link_note['id'] ,link_note.get_text()


# 正则获取
print u'方法:正则获取'
link_note = soup.find('a', href=re.compile('lie'))
print link_note.name, link['href'], link_note['class'], link_note['id'] ,link_note.get_text()


# 获取p段落文字
print u'p段落文字'
p_note = soup.find('p', class_="story")
print p_note.name, p_note['class'], link_note.get_text()


输出结果如下:

所有连接
<class 'bs4.element.ResultSet'>
a http://example.com/elsie [u’sister’] link1 Elsie
a http://example.com/lacie [u’sister’] link2 Lacie
a http://example.com/tillie [u’sister’] link3 Tillie
elsie相关
a http://example.com/tillie [u’sister’] link1 Elsie
方法:正则获取
a http://example.com/tillie [u’sister’] link3 Tillie
p段落文字
p [u’story’] Tillie


已经实现教程架构
python爬虫实战:抓取百度百科1000个分级基金的页面信息

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
hexo
2 条回复 A 作者 M 管理员
  1. 手下我的膝盖

    • 表示膝盖在哪

欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论