查看原文
其他

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

叉烧ZBayes CS的陋室 2022-08-08

往期:

【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管理器,网页下载器和网页解析器。爬虫调度端指的是对爬虫发布指令的端口,人可以对其进行设置,爬什么内容,怎么爬,需要进行什么其他的操作等,通过爬虫,就能够得到所需的有价值的数据。

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

URL管理器

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

  • 添加新URL到待爬集合中。

  • 判断待添加URL是否在容器中。

  • 获取待爬取URL。

  • 判断是否还有待爬取URL。

  • 将待爬取URL移动到已爬取。

实现方式:

  1. 内存:python的set集合

  2. 关系数据库,MySQL,urls(url, is_crawled)

  3. 缓存数据库:redis的set集合

网页下载器

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

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()

网页解析器

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

Beautiful Soup

  • python第三方库,用于从HTML或者XML中提取数据,有自己的,同时还有。

  • 其下载方式可在API文档中找到。

官网网址:

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

API文档:

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


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

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

<a href='123.html' class='article_link'>python</a>

能有三种方式搜索

  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')

# 访问节点信息# 得到节点信息:<a href='1.html'>python<a># 获取查找到的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 = """ <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 '获取所有的链接'
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基本的知识先讲到这里,下次给大家讲一个详细完整的例子吧。



微信:zgr950123
QQ:545281848欢迎关注


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存