mooc python网络爬虫与信息提取第一周_第3次作业-MOOC学习笔记:Python网络爬虫与信息提取...

学习进度

a8872543edb3d8d939450c0918dcbbd7.png

3209dcd14176cc7799fe0ef1e8acf59b.png

4accdf6220d8d540d66ca18efc3f16f1.png

2ed1888ca531107c444c8efcc64afd0b.png

8867a4822b906615dce8c0e5a706cbc6.png

Python网络爬虫与信息提取学习笔记

第一周:

Requests库入门:

Requests库的安装:在命令提示符界面输入:pip install requests

Requests库有7个主要的方法,分别是:

requests.request() : 构造一个请求,支撑以下各方法的基础方法;

requests.get() : 获取HTML网页的主要方法,对应于HTTP的GET;

requests.head() : 获取HTML网页头信息的方法,对应于HTTP的HEAD;

requests.post() : 向HTML网页提交POST请求的方法,对应于HTTP的POST;

requests.put() : 向HTML网页提交PUT请求的方法,对应于HTTP的PUT;

requests.patch() : 向HTML网页提交局部修改的请求,对应于HTTP的PATCH;

requests.delete() : 向HTML页面提交删除请求,对应于HTTP的DELETE。

Requests库有2个重要对象,分别是Response对象和Request对象。

Response对象包含服务器返回的所有信息,也包含请求的Request信息。Response对象的属性有:

r.status_code :HTTP请求的返回状态,200表示连接成功。

r.text :HTTP响应内容的字符串形式,即url对应的页面内容。

r.encoding :从HTTP  header中猜测的响应内容编码方式。

r.apparent_encoding:从内容中分析出的响应内容编码方式(备选编码方式)。

r.content:HTTP响应内容的二进制形式。

爬取网页的通用代码框架:

import requests

def getHTMLText(url):

try:

r = requests.get(url,timeout=30)

r.raise_for_status()

r.encoding = r.apparent_encoding

return r.text

except:

return "产生异常"

if __name__ == "__main__":

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

print(getHTMLText(url))

网络爬虫的Robots协议:

Robots Exclusion Standard,网络爬虫排除标准

作用:网站告知网络爬虫哪些页面可以爬取,哪些不行。

形式:在网站根目录下的robots.txt文件

例如:京东的Robots协议

http://www.jd.com/robots.txt

Robots协议的使用

网络爬虫:自动或人工识别robots.txt,再进行内容爬取。

约束性:Robots协议是建议但非约束性的,网络爬虫可以不遵守,但存在法律风险。

对Robots协议的理解

爬取网页/玩转网页:访问量很小时可以遵守;访问量较大时建议遵守。

爬取网站/爬取系列网站:非商业且偶尔时建议遵守;商业利益时必须遵守。

爬取全网:必须遵守。

Requests库网络爬取实战

实例1:京东商品页面爬取

import requests

url = "http://item.jd.com/2967929.html"

try:

r = requests.get(url,timeout=30)

r.raise_for_status()

r.encoding = r.apparent_encoding

print(r.text[:1000])

except:

print("爬取失败")

实例2:亚马逊商品页面爬取

import requests

url = "http://www.amazon.cn/gp/product/B01M8L5Z3Y"

try:

kv = {'user-agent':'Mozilla/5.0'}

r = requests.get(url,headers=kv)

r.raise_for_status()

r.encoding = r.apparent_encoding

print(r.text[1000:2000])

except:

print("爬取失败")

实例3:百度收索全代码

import requests

keyword = "Python"

url = "http://item.jd.com/2967929.html"

try:

kv = {'wd':keyword}

r = requests.get(url,params=kv)

r.raise_for_status()

r.encoding = r.apparent_encoding

print(len(r.text))

except:

print("爬取失败")

实例4:网络图片的爬取

import requests

import os

url = "http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg"

root = "D://pics//"

path = root + url.split('/')[-1]

try:

if not os.path.exists(root):

os.mkdir(root)

if not os.path.exists(path):

r = requests.get(utl)

with open(path,'wb') as f:

f.write(r.content)

f.close()

print("文件保存成功")

else:

print("文件已存在")

except:

print("爬取失败")

实例5:IP地址归属地的自动查询

import requests

url = "http://m.ip138.com/ip.asp?ip="

try:

r = requests.get(url+'202.204.80.112')

r.raise_for_status()

r.encoding = r.apparent_encoding

print(r.text[-500:])

except:

print("爬取失败")

第二周:

BeautifulSoup库入门

BeautifulSoup库安装:在命令提示符页面输入pip install beautifulsoup4  。

BeautifulSoup库的理解:

BeautifulSoup可=库是解析、遍历、维护“标签树”的功能库

db5a44ccbb5cb366d9995227b3d0838c.png

762376a05ea016af9ddfdea95c86265d.png

BeautifulSoup类的基本元素:

Tag:标签,最基本的信息组织单元,分别用<>和>标明开头和结尾;

Name:标签的名字,用

...

的名字是'p',格式:.name

Attributes:标签的属性,字典形式组织,格式:.attrs

NavigableString:标签内非属性字符串,<>...>中字符串,格式:.string

Comment:标签内字符串的注释部分,一种特殊的Comment类型

d765fc261c4604281ea6a854437b1b71.png

基于bs4库的HTML内容遍历方法:

33f9b32077fc080b5c476e71f64f8757.png

3eda7101910f7c5879840338d4e8d217.png

标签树的下行遍历:

.contents:子节点的列表,将所有儿子节点存入列表;

.children:子节点的迭代类型,与.contents类似,用于循环遍历儿子节点;

.descendants:子孙节点的迭代类型,包含所有子孙节点,用于循环遍历。

ccea9d82ece2e0ff71a22b5a6b8d9e65.png

标签树的上行遍历:

.parent:节点的父亲标签;

.parents:节点先辈标签的迭代类型,用于循环遍历先辈节点。

f5f7b3fcad3722a3debef4262329a544.png

标签树的平行遍历:

.next_sibling:返回按照HTML文本顺序的下一个平行节点标签;

.previous_sibling:返回按照HTML文本顺序的上一个平行节点标签;

.next_siblings:迭代类型,返回按照HTML文本顺序的后续所有平行节点标签;

.previous_siblings:迭代类型,返回按照HTML文本顺序的前序所有平行节点标签。

8ab8ed62d4c79c86e72f6fb0a6050912.png

caa77333d4d0feae7d97acb9ad2324c9.png

73a2f19a1650743480a4edb1851867a3.png

bs4库的prettify()方法可以为HTML文本<>及其内容增加更多'\n',用法是:.prettify()

8a27897a83802ce2b8821d0ae51a72c4.png

BeautifulSoup库入门总结:

b3e3ce02d6a5b73eb83193fd808394c3.png

信息标记与提取方法:

信息标记的好处:

标记后的信息可形成信息组织结构,增加了信息维度;

标记的结构与信息一样具有重要价值;

标记后的信息可用于通信、存储或展示;

标记后的信息更利于程序理解和运用。

信息标记的三种形式:

XML

92861151311d7e056a3211daaf9a477e.png

5c39421b7519f2b9a2b4f9af0c96638d.png

JSON

4dbfac6bb35b312fac54c5e942cad86d.png

031c310cc28a5560b084f63f5ab2278b.png

b8f3bd15d8cb3f3128b0c8e2bc9430fd.png

bd2705c62eef55f511f204d3f5dc4eeb.png

12ff964fb0c49ab3efcec4820b36a22a.png

YAML

15e38331b77c31d14afcb089fd844533.png

177327f8c0c7aaad53b44bd980cdf0c0.png

6e26c259366accf635e66631f0df3e73.png

efc5280d94ef9008ded33742fdcdb6fb.png

b5462772e65864589709ff350796bf52.png

三种信息标记形式的比较:

XML:最早的通用信息标记语言,可扩展性好,但繁琐;

JSON:信息有类型,适用程序处理(JS),较XML简洁;

YAML:信息无类型,文本信息比例最高,可读性好。

三种信息标记形式适用场景的比较:

XML:Internet上的信息交互与传递;

JSON:移动应用云端和节点的信息通讯,无注释;

YAML:各类系统的配置文件,有注释易读。

信息提取:从标记后的信息中提取所关注的内容

3ec12999a0c2ba01e84b22bb95dccf56.png

c87bf20992aed10fa570ed1fd995cb38.png

融合方法:

03d0cfcc5e7f43e91c4378718171644e.png

基于bs4库的HTML内容查找方法:

<>.find_all(name,attrs,recursive,string,**kwargs)

返回一个列表类型,存储查找的结果;

.name:对标签名称的检索字符串;

.attrs:对标签属性值的检索字符串,可标注属性检索;

.recursive:是否对子孙全部检索,默认True;

.string:<>...>中字符串区域的检索字符串。

(..)  等价于  .find_all(..)

soup(..)   等价于  soup.find_all(..)

a1d00fc10d91e82f74cfbd67f1f23aa2.png

实例:中国大学排名定向爬虫

import requests

from bs4 import BeautifulSoup

import bs4

def getHTMLText(url):

try:

r = requests.get(url, timeout=30)

r.raise_for_status()

r.encoding = r.apparent_encoding

return r.text

except:

return ""

def fillUnivList(ulist, html):

soup = BeautifulSoup(html, "html.parser")

for tr in soup.find('tbody').children:

if isinstance(tr, bs4.element.Tag):

tds = tr('td')

ulist.append([tds[0].string, tds[1].string, tds[3].string])

def printUnivList(ulist, num):

print("{:^10}\t{:^6}\t{:^10}".format("排名","学校名称","总分"))

for i in range(num):

u=ulist[i]

print("{:^10}\t{:^6}\t{:^10}".format(u[0],u[1],u[2]))

def main():

uinfo = []

url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2019.html'#这里需要注意,若运行不了,建议更新下最新的url链接

html = getHTMLText(url)

fillUnivList(uinfo, html)

printUnivList(uinfo, 20) # 20 univs

main()

c12df6663d08b235a003fae941d5a2d3.png

第三周:

正则表达式入门:

正则表达式是用来简洁表达一组字符串的表达式;是一种通用的字符串表达框架。

正则表达式在文本处理器中十分常用:表达文本类型的特征(病毒、入侵等);同时查找或替换一组字符串;匹配字符串的全部或部分(最主要应用在字符串匹配中)等。

正则表达式的语法:

正则表达式语法由字符和操作符构成,常用的操作符如下图所示:

80a9d0101082f5280314e6a81da77c81.png

9e275e8b7ce37c38aa33f806f0a65873.png

经典正则表达式实例:

95ec80c336de2fb368b3549388b12bbb.png

re库介绍:

re库是Python的标准库,主要用于字符串匹配。

调用方式:import  re

正则表达式的表示类型:

raw string类型(原生字符串类型)

re库采用raw string类型表达式正则表达式,表示为:r'text'

raw string是不包含对转义符再次转义的字符串

re库也可以采用string类型表示正则表达式,但更繁琐。建议当正则表达式包含转义符时,使用raw string.

re库主要功能函数:

382c95ef948474794a51942e0c223a32.png

第四周:

Scrapy爬虫框架

Scrapy的安装:打开命令提示符输入  pip install scrapy。

Scrapy爬虫框架结构:

28b19b0c2d369d60883827ab99ae7e7e.png

1574379abab848d6e3361dc953c71571.png

f4d909b75a2ec35fa2ec79e66711ca83.png

102f2e94ef9e9145f60ed551a43e408d.png

67a0e64f953545dc24c9a94d83e46595.png

requests库和Scrapy爬虫的比较:

相同点:

两者都可以进行页面请求和爬取,Python爬虫的两个重要技术路线;

两者可用性都好,文档丰富,入门简答;

两者都没有处理js、提交表单、应对验证码等功能(可扩展)。

不同点:

9d9faf46a97059fedef6af6874218f80.png

Scrapy命令行:

Scrapy是为持续运行设计的专业爬虫框架,提供操作的Scrapy命令行。在Win下,启动cmd控制台:

f5c83a291a273855d04e19a2ce911c17.png

30161b0252eaf25d718b401ffaefa2c1.png

为什么Scrapy采用命令行创建和运行爬虫?

命令行更容易自动化,适合脚本控制,本质上,Scrapy是给程序员用的,功能(而不是界面)更重要。

Scrapy爬虫基本使用:

de364234f07d5b77be39b64c1895eac5.png

步骤1:建立一个Scrapy爬虫工程。

Scrapy startproject python123demo

ca2bb111b2a5b204f60f462d7cf20cee.png

897078af8fe85451293fafe9cf73e1e1.png

步骤2:在工程中产生一个Scrapy爬虫

进入工程目录,然后执行如下命令:

scrapy genspider demo python123.io

该命令的作用:

(1)生成一个名词为demo的spider;

(2)在spiders目录下增加代码文件demo.py。

303ff3e1a517ef24ebdf15aa2424b118.png

步骤3:配置产生的spider爬虫

32cd3c984d22026b651cdfae1e0f7940.png

步骤4:运行爬虫,获取网页

在命令行下,执行如下命令:

scrapy crawl demo

demo爬虫被执行,捕获页面存储在demo.html。

yield关键字:

db9066ee74bada660cfa0ebb381ff938.png

c6af8e3ad51b1ad6b3eda63f40a40bb3.png

为何要有生成器?

生成器相比一次列出所有内容的优势:

(1)更节省存储空间;

(2)响应更迅速;

(3)使用更灵活。

Scrapy爬虫的数据类型:

4defc0364a7ccb933c208cfe972cfe40.png

4654bd5e0e5d5182a05bdc802c9ec0bc.png

0341c136cc38d73b74f8a0e79cabaa50.png

582a2f69580a686cac04481aadd551f4.png

1aaaedd2d2eb9decb6a4e222c1926efb.png

04c2c374a335724ff74a047b65d66264.png

Scrapy爬虫提取信息的方法:

Scrapy爬虫支持多种HTML信息提取方法:

Beautiful Soup

lxml

re

XPath Selector

CSS Selector

06aef979c68a497f836897903ba6987c.png

学习的体会和收获

不愧是国家精品课程,讲解知识通俗易懂,内容生动有趣。通过这段时间的学习,让我对爬虫有了基本的认识。以前买过一本网络爬虫的书,也看过几章《网络数据采集》,里面也讲了Beautiful Soup库,讲的也比较深,但是跟视频比起来,就没那么容易懂了。

通过这段时间的学习,收获了一个自学的好去处,这个网站里面的课程不可不畏精品,业余时间可以很好的给自己充充电。最大的收获莫过于让我了解了爬虫的步骤,先要想办法获取目标页面的源代码,然后就可以使用BeautifulSoup库来烹制这锅美味的汤了。在烹制过程中可以使用正则表达式为其助力。

正所谓“万事开头难”,此课程带我迈开了第一步。后面我就知道想要继续深入学习我应该怎么学,这是最重要的。师傅领进门,修行靠个人。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值