【41计划打卡-04】python爬虫基础

小程序混合云MySQL

picture.image

往期:

【41计划打卡-01】R语言个人学习笔记

【41计划打卡-02】AvalonJs-前端MVVM框架

【41计划打卡-03】《大数据时代》读后感

前言

Python 是当前进行科学计算、数据挖掘的重要开发语言,因为大数据的崛起使之也逐渐流行,Python在网络抓取中性能较好,同时爬取的数据也能直接利用Python本身的开源工具进行挖掘,同时,由于Python现成的包好工具都比较成熟,非常适合编写爬虫和运用数据,这就使Python成了目前比较流行的用于编写爬虫的语言。

学习链接:

Python开发简单爬虫:http://www.imooc.com/learn/563

开发环境

每个人的开发环境各异,下面上是我的开发环境,对于必须的工具,我会 加粗。

windows10 (操作系统) ,pycharm (IDE,当然,用eclipse和sublime均可)python (这个必须的额,我下面实现的代码版本是 2.7), BeautifulSoup4urllib2 等。

什么是爬虫

爬虫是自动从互联网上获取数据的程序

下面是一张对简单爬虫的结构进行描述的图,其主体是URL管理器,网页下载器和网页解析器。爬虫调度端指的是对爬虫发布指令的端口,人可以对其进行设置,爬什么内容,怎么爬,需要进行什么其他的操作等,通过爬虫,就能够得到所需的有价值的数据。

picture.image

下面一张时序图图简单讲述了爬虫的运行流程。从上往下看,调度器访问URL管理器查看其中由于可访问的待爬取的URL,如果返回是即将1个待爬的URL传给调取器,调度器让下载器将URL对应的网页下载下来,返回给调度器,调度器将下载的网页发给解析器进行解析,解析之后返回到调度器,此时数据已经初步形成,可以开始进一步的使用。如此循环直到URL管理器为空或者数据量足够大。 picture.image

URL管理器

URL管理器 :管理待抓取的URL集合和已抓取URL集合。主要实现下面种功能。

  • 添加新URL到待爬集合中。
  • 判断待添加URL是否在容器中。
  • 获取待爬取URL。
  • 判断是否还有待爬取URL。
  • 将待爬取URL移动到已爬取。

实现方式:

  1. 内存:python的set集合
  2. 关系数据库,MySQL,urls(url, is_crawled)
  3. 缓存数据库:redis的set集合

网页下载器

网页下载器:将互联网上URL对应网页下载到本地的工具。
picture.image

python的网页下载器

  • urllib2-python-官方基础模块
  • requests-第三方更强大

urllab2下载器使用方法:

  1. 最简捷方法:直接写出链接并且请求。

import urllib2

直接请求

response=urllib2.urlopen('http://www.baidu.com')

获取状态吗,如果是200表示成功

print response.getcode()

#读取内容
cont=response.read()

  1. 添加data、http helper,data和httphelper能分别为下载提供更加精确的目标,同时可以模仿浏览器对网页进行访问,能攻破一些反爬虫策略。

import urllib2

创建Request对象

request urllib2.Request(url)

添加数据

request.add_data('a','1')

添加http的header

request.add_header('User-Agent','Mozilla/5.0')

发送请求获取结果

response=urllib2.urlopen(request)

  1. 添加特殊情景处理器,例如账号密码输入等,有些网站只有在用户登录时才能浏览,而情景处理器就能模拟这形式。

import urllib2, cookielib

创建cookie容器# 创建一个opener

opener=urllib.build_opener(urllib2.HTTPCookieProcessor(cj))

给urllib2安装opener

urllib2.install_opener(opener)

使用带有cookie的urllib2访问网页

response=urllib2.urlopen(request)

运行实例:

coding:utf-8

import urllib2,cookielib

url="http://www.baidu.com"

print '方法1'
response1=urllib2.urlopen(url)
print response1.getcode()
print len(response1.read())

print '方法2'
request=urllib2.Request(url) request.add_header("user-agent","Mozilla/5.0") response2=urllib2.urlopen(request)
print response2.getcode()
print len(response2.read())

print '方法3'
cj=cookielib.CookieJar() opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) urllib2.install_opener(opener) response3=urllib2.urlopen(request)
print response3.getcode()
print cjprint response3.read()

网页解析器

网页解析器:从网页中提取有价值数据的工具,侧面而言,也能看做是整合数据的一个步骤,但是由于爬取数据复杂度较高,所以不会将太多的数据整合、集成、清洗任务放在这里,只是进行简单的整合,成为数组或者矩阵等而已。
picture.image

Beautiful Soup

  • python第三方库,用于从HTML或者XML中提取数据,有自己的官网,同时还有API文档。
  • 其下载方式可在API文档中找到。

官网网址:

https://www.crummy.com/software/BeautifulSoup/

API文档:

https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

用法介绍如下图所示。BeautifulSoup对象创建之后能够去搜索节点,根据节点名、属性值或者是节点文字等信息进行查询,能够达到精确搜索的目的,减少垃圾数据获取。
picture.image

举一个例子,对一个标签:

python

能有三种方式搜索

  1. 节点名称:a
  2. 节点属性:"href='123.html',和class=article_link"
  3. 节点内容:python

语法使用如下:

from bs4 import BeautifulSoup

根据HTML网页字符串创建BeautifulSoup对象

soup=BeautifulSoup(
html_doc, # HTML文档字符串
'html.parser' # HTML解析器
from_encoding='utf-8' # HTML文档编码
)

搜索节点
方法:find_all(name,attrs,string)
查找所有标签为a的节点

soup.find_all('a')

查找所有标签为a,链接符合/view/123.htm形式的节点

soup.find_all('a',href='/view/123.htm') soup.find_all('a',href=re.compile(r'/view/\d+.htm'))

查找所有标签为div,class为abc,文字为python节点

soup.find_all('div',class_='abc',string='python')

访问节点信息# 得到节点信息:python# 获取查找到的a节点的href属性

node.name

获取查找到的a节点的href属性

node['href']

获取查找到的a节点的链接文字

node.get_text()

下面是具体的案例:

coding:utf-8
# 测试BeautifulSoup的程序
import bs4# print bs4

from bs4 import BeautifulSoup
import re

html_doc = """

The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were Elsie, Lacie and Tillie; and they lived at the bottom of a well.

...

"""

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

print '获取所有的链接'
links=soup.find_all('a')
for link in links:
print link.name,link['href'],link.get_text()

print '获取Lacie的链接'
link_node=soup.find('a',href='http://example.com/lacie')
print link_node,link_node['href'],link_node.get_text()

print '正则匹配'
link_node=soup.find('a',href=re.compile(r"ill"))
print link_node,link_node['href'],link_node.get_text()

print '获取P段落文字'
p_node=soup.find('p',class_="title")
print p_node.name,p_node.get_text()

Python基本的知识先讲到这里,下次给大家讲一个详细完整的例子吧。

picture.image

微信:zgr950123

QQ:545281848

picture.image

欢迎关注

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论