python简单爬虫开发

说明:
1.本文根据慕课网课程python开发简单爬虫学习,实例内容为爬取百度百科上关于python的1000条词条的标题和简介。
2.在慕课网上使用的是python2,本文为python3,某些模块有点小差别

一、相关知识

爬虫:自动从互联网上获取信息的程序,我们可以从互联网上爬取我们想要的数据来为我所用,比如可以根据爬取的数据来写一个笑话app。

简单爬虫架构:
这里写图片描述
简单说明:整个程序由一个调度程序来调度URL管理器、网页下载器和网页解析器,URL管理器顾名思义管理URL,主要包括两个集合,待抓取URL集合和已爬取URL集合,在待爬取的URL集合中提供URL给网页下载器,网页下载器可以通过URL下载网页HTML文件,保存为一个字符串;网页解析器根据下载的HTML文件解析出需要的数据并保存,同时从该HTML中解析出新的URL集合添加到URL管理器的待爬取URL集合中。

架构运行流程
这里写图片描述

URL管理器
在URL管理器是为了防止循环抓取(网页之间相互链接)和重复抓取(一个网页被多个网页链接),包括两个集合待爬取URL集合和已爬取URL集合
在添加新的URL到集合中时我们需要判断是否已经在集合(俩),若否则添加;当从URL集合中获取新的URL我们需要判断待爬取集合是否为空和把取出的这条URL添加到已爬取的URL中。
URL实现方式:
这里写图片描述
网页下载器和urllib.request
**说明:**python2中为模块urllib2,在代码中主需要将urllib.request换成urllib2即可
网页下载器即将URL对应的网页HTML文件下载到本地的工具。我们可以使用官方提供的urllib.request模块来是实现或者使用第三方模块requests
使用urllib.request的三种方式:
1.直接获取html文件

import urllib.request

html_data = urllib.request.urlopen('http://www.baidu.com')
#getcode方法可以获取状态,200为成功
code = html_data.getcode()
#read方法读取html字符串
content = html_data.read()
print(code)
print(content)

2.传递服务器需要的数据和http header
可以通过urllib.request.Request方法将url,data,http header打包成一个request对象,将该对象作为urlopen函数的参数。

import urllib.request

request = urllib.request.Request(url)
#add_data方法添加数据
request.add_data('a','1')                       #给a这个数据项传入1
#add_header添加http header
request.add_header(('User-Agent','Mozila/5.0')  #伪装成一个Mozila浏览器
html_data = urllib.request.urlopen(request)

3.对于特殊情形的处理
比如说需要登陆的网页我们需要用HTTPCookieProcessor来处理,需要代理的用ProxyHandler处理,HTTPS加密访问则需要HTTPSHandler来处理,对于相互自动跳转的网页用HTTPRedirectHandler来处理。可以通过build_opener方法穿件一个opener,再用install_opener方法,最后在使用前两种方法来获取html字符串。

#对于python2为cookielib模块
import urllib.request,http.cookiejar             
#创建一个cookiejar保存cookie内容
cj = http.cookiejar.CookieJar()                  
#创建一个cookie处理对象
handler = urllib.request.HTTPCookieProcessor(cj) 
#构建一个带cookie的打开方式
opener = urllib.request.build_opener(handler)   
urllib.request.install_opener(opener)
data_html = urllib.request.urlopen(url)
content = data_html.read()
print(content)

网页解析器和BeautifulSoup模块
网页解析器,即从网页中提取出有价值数据的工具和新的url列表。
python的几种网页解析器:正则表达式,html_parser模块(自带),BeautifulSoup模块(第三方),lxml(自带)
其中BeautifulSoup可以使用html_parser和lxml来解析网页。BeautifulSoup采用结构化DOM树来解析。
使用BeautifulSoup需要安装第三方库beautifulsoup4.(pip3 install beautifulsoup4),官方文档
使用实例

#!/usr/bin/env python3
#_*_ 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>
"""

#先创建一个BeautifulSoup对象,参数分别为html字符串,解析器,html文档使用的编码
soup = BeautifulSoup(html_doc,'html.parser',from_encoding='utf-8')
print('获取所有的链接')
#find_all方法找到所有的符合的节点
links = soup.find_all('a')
for link in links:
    print(link.name,link['href'],link.get_text()) #对于节点可以访问节点名称、属性值、节点文本
print('获取lacie链接')
#find找到符合的第一个节点
link1 = soup.find('a',href='http://example.com/lacie')
print(link1.name,link1['href'],link1.get_text())

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

print('获取p段落文字')
link_node = soup.find('p',class_='story')
print(link_node.name,link_node['class'],link_node.get_text())

二、实例—爬去百度百科上Pthon词条相关的词条1000条

代码在这里

开发一个爬虫的基本步骤:

这里写图片描述

本实例的目标分析:

目标:百度百科Pthon词条相关词条网页—标题和简介
入口页:https://baike.baidu.com/item/Python/407313
URL格式:
-词条页面URL:/item/… URL不是完整的需要变成完整的URL在添加到待爬取URL集合中。
数据格式:(主要是为了知道在那里获取数据)
-标题:<dd class = "lemmaWgt-lemmaTitle-title"><h1>***</h1></dd>
-简介:<div class = "lemma-summary">***</div>

代码逻辑:

注意事项:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值