Python爬虫学习笔记

本篇笔记主要基于莫烦老师的python爬虫入门教程:https://morvanzhou.github.io/tutorials/data-manipulation/scraping/
本片笔记的完整代码见

I. 认识网页构成

1.1 HTML

HTML即超文本标记语言(Hyper Text Markup Language),制作网页的一种标记语言(Markup Language),不是一种编程语言。
1.1.1 HTML的结构:HTML中每个实体都用tag框住,从而可以被展示为不同的形式或功能。爬虫:根据tag来找到合适的信息。
(1)header:存放网元信息,即给浏览器看的内容;
(2)body:存放网页信息,即显示给用户的内容,如视频,图片,文字等。

1.2 Python的网页操作

1.2.1 用python登录网页并打印网页信息

from urllib.request import urlopen
# if has Chinese, apply decode()
html = urlopen("https://morvanzhou.github.io/static/scraping/basic-structure.html").read().decode('utf-8')
print(html)

输出:





Scraping tutorial 1 | 莫烦Python



爬虫测试1



这是一个在 莫烦Python
爬虫教程 中的简单测试.



1.2.2用Python的正则表达式匹配网页信息

import re
res = re.findall(r'

(.*?)

',html, flags=re.DOTALL) print('\nPage paragraph is ',res[0])

输出:

Page paragraph is
这是一个在 莫烦Python
爬虫教程 中的简单测试.

res = re.findall(r'href="(.*?)"',html)
print('\nAll links: ')
for r in res:
    print(r)

输出:

All links:
https://morvanzhou.github.io/static/img/description/tab_icon.png
https://morvanzhou.github.io/
https://morvanzhou.github.io/tutorials/data-manipulation/scraping/

II. 用BeautifulSoup解析网页

2.1 BeautifulSoup简介
  • 中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库,它代替了正则表达式来选取HTML中的tag等相关信息。
使用Beautiful Soup爬取网站信息的步骤:

  1. 选取网址(url)
  2. 使用python登录该网址(uropen等)
  3. 读取网页信息(read()等)
  4. 将读取的信息放入Beautiful Soup
  5. 使用Beautiful Soup选取tag信息等
2.2应用实例
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, features='lxml')
print(soup.h1)
print(soup.p)
all_href = soup.find_all('a')
print(all_href)
all_href = [item['href'] for item in all_href]
print(all_href)

输出:

爬虫测试1



这是一个在 莫烦Python
爬虫教程 中的简单测试.


[莫烦Python, 爬虫教程]
['https://morvanzhou.github.io/', 'https://morvanzhou.github.io/tutorials/data-manipulation/scraping/']

III. Beautiful Soup和CSS

层叠样式表(Cascading Style Sheets,CSS)是一种用来表现HTML或XML(标准通用标记语言的一个子集)等文件样式的计算机语言。简单来说,CSS是用来装饰HTML的。

3.1 CSS的Class

CSS 在装饰每一个网页部件的时候, 都会给它一个名字。 而且一个类型的部件, 名字都可以一样。

from bs4 import BeautifulSoup
from urllib.request import urlopen
html = urlopen('https://morvanzhou.github.io/static/scraping/list.html').read().decode('utf-8')
print(html)

输出:




爬虫练习 列表 class | 莫烦 Python



列表 爬虫练习


这是一个在 莫烦 Python爬虫教程
里无敌简单的网页, 所有的 code 让你一目了然, 清晰无比.



  • 一月


    • 一月一号

    • 一月二号

    • 一月三号


  • 二月

  • 三月

  • 四月

  • 五月



提取所有month的信息

soup = BeautifulSoup(html, features='lxml')
month = soup.find_all('li', {'class':'month'})
for m in month:
print(m.get_text())

输出:
一月
二月
三月
四月
五月

提取所有月份+日期的信息

jan = soup.find('ul', {"class":"jan"})
d_jan = jan.find_all('li')
for d in d_jan:
    print(d.get_text())

输出:
一月一号
一月二号
一月三号

3.2 正则表达式匹配网页
from bs4 import BeautifulSoup
from urllib.request import urlopen
html = urlopen("https://morvanzhou.github.io/static/scraping/table.html").read().decode('utf-8')
print(html)
#找出所有图片的链接
import re
soup = BeautifulSoup(html, features='lxml')
img_links = soup.find_all("img", {"src": re.compile('.*?\.jpg')})
for link in img_links:
    print(link['src'])
#输出
#https://morvanzhou.github.io/static/img/course_cover/tf.jpg
#https://morvanzhou.github.io/static/img/course_cover/rl.jpg
#https://morvanzhou.github.io/static/img/course_cover/scraping.jpg
#找出所有课程的链接:以https://morvan开头
course_links = soup.find_all('a', {'href':re.compile('https://morvan.*')})
for link in course_links:
    print(link['href'])
#输出:
#https://morvanzhou.github.io/
#https://morvanzhou.github.io/tutorials/data-#manipulation/scraping/
#https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/
#https://morvanzhou.github.io/tutorials/machine-learning/reinforcement-learning/
#https://morvanzhou.github.io/tutorials/data-manipulation/scraping/

IV. 练习:用BeautifulSoup爬取百度百科

from bs4 import BeautifulSoup
from urllib.request import urlopen
import re
import random
base_url = "https://baike.baidu.com"
his = ["/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/5162711"]
for i in range(20):
    url = base_url + his[-1]
    html = urlopen(url).read().decode('utf-8')
    soup = BeautifulSoup(html, features='lxml')
    print(i, soup.find('h1').get_text(), ' url: https://baike.baidu.com'+his[-1])
#     print(' url', his[-1])
    sub_urls = soup.find_all("a", {"target":"_blank", "href":re.compile("^/item/(%.{2})+$")})
    if len(sub_urls)!=0:
        his.append(random.sample(sub_urls, 1)[0]['href'])
    else:
        his.pop()
#输出:
0 网络爬虫  url: [https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/5162711](https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB/5162711)
1 深度优先策略  url: [https://baike.baidu.com/item/%E6%B7%B1%E5%BA%A6%E4%BC%98%E5%85%88%E7%AD%96%E7%95%A5](https://baike.baidu.com/item/%E6%B7%B1%E5%BA%A6%E4%BC%98%E5%85%88%E7%AD%96%E7%95%A5)
2 网络爬虫  url: [https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB](https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C%E7%88%AC%E8%99%AB)
3 斯坦福大学  url: [https://baike.baidu.com/item/%E6%96%AF%E5%9D%A6%E7%A6%8F](https://baike.baidu.com/item/%E6%96%AF%E5%9D%A6%E7%A6%8F)
4 欧洲  url: [https://baike.baidu.com/item/%E6%AC%A7%E6%B4%B2](https://baike.baidu.com/item/%E6%AC%A7%E6%B4%B2)
5 义项  url: [https://baike.baidu.com/item/%E4%B9%89%E9%A1%B9](https://baike.baidu.com/item/%E4%B9%89%E9%A1%B9)
6 保尔·柯察金  url: [https://baike.baidu.com/item/%E4%BF%9D%E5%B0%94%C2%B7%E6%9F%AF%E5%AF%9F%E9%87%91](https://baike.baidu.com/item/%E4%BF%9D%E5%B0%94%C2%B7%E6%9F%AF%E5%AF%9F%E9%87%91)
7 神父  url: [https://baike.baidu.com/item/%E7%A5%9E%E7%88%B6](https://baike.baidu.com/item/%E7%A5%9E%E7%88%B6)
8 北京大学  url: [https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC%E5%A4%A7%E5%AD%A6](https://baike.baidu.com/item/%E5%8C%97%E4%BA%AC%E5%A4%A7%E5%AD%A6)
9 基础学科拔尖学生培养试验计划  url: [https://baike.baidu.com/item/%E5%9F%BA%E7%A1%80%E5%AD%A6%E7%A7%91%E6%8B%94%E5%B0%96%E5%AD%A6%E7%94%9F%E5%9F%B9%E5%85%BB%E8%AF%95%E9%AA%8C%E8%AE%A1%E5%88%92](https://baike.baidu.com/item/%E5%9F%BA%E7%A1%80%E5%AD%A6%E7%A7%91%E6%8B%94%E5%B0%96%E5%AD%A6%E7%94%9F%E5%9F%B9%E5%85%BB%E8%AF%95%E9%AA%8C%E8%AE%A1%E5%88%92)
10 中华人民共和国教育部  url: [https://baike.baidu.com/item/%E6%95%99%E8%82%B2%E9%83%A8](https://baike.baidu.com/item/%E6%95%99%E8%82%B2%E9%83%A8)
11 厦门大学  url: [https://baike.baidu.com/item/%E5%8E%A6%E9%97%A8%E5%A4%A7%E5%AD%A6](https://baike.baidu.com/item/%E5%8E%A6%E9%97%A8%E5%A4%A7%E5%AD%A6)
12 吴宣恭  url: [https://baike.baidu.com/item/%E5%90%B4%E5%AE%A3%E6%81%AD](https://baike.baidu.com/item/%E5%90%B4%E5%AE%A3%E6%81%AD)
13 经济学动态  url: [https://baike.baidu.com/item/%E7%BB%8F%E6%B5%8E%E5%AD%A6%E5%8A%A8%E6%80%81](https://baike.baidu.com/item/%E7%BB%8F%E6%B5%8E%E5%AD%A6%E5%8A%A8%E6%80%81)
14 吴宣恭  url: [https://baike.baidu.com/item/%E5%90%B4%E5%AE%A3%E6%81%AD](https://baike.baidu.com/item/%E5%90%B4%E5%AE%A3%E6%81%AD)
15 经济学动态  url: [https://baike.baidu.com/item/%E7%BB%8F%E6%B5%8E%E5%AD%A6%E5%8A%A8%E6%80%81](https://baike.baidu.com/item/%E7%BB%8F%E6%B5%8E%E5%AD%A6%E5%8A%A8%E6%80%81)
16 吴宣恭  url: [https://baike.baidu.com/item/%E5%90%B4%E5%AE%A3%E6%81%AD](https://baike.baidu.com/item/%E5%90%B4%E5%AE%A3%E6%81%AD)
17 五个一工程  url: [https://baike.baidu.com/item/%E4%BA%94%E4%B8%AA%E4%B8%80%E5%B7%A5%E7%A8%8B](https://baike.baidu.com/item/%E4%BA%94%E4%B8%AA%E4%B8%80%E5%B7%A5%E7%A8%8B)
18 河北省委宣传部  url: [https://baike.baidu.com/item/%E6%B2%B3%E5%8C%97%E7%9C%81%E5%A7%94%E5%AE%A3%E4%BC%A0%E9%83%A8](https://baike.baidu.com/item/%E6%B2%B3%E5%8C%97%E7%9C%81%E5%A7%94%E5%AE%A3%E4%BC%A0%E9%83%A8)
19 五个一工程  url: [https://baike.baidu.com/item/%E4%BA%94%E4%B8%AA%E4%B8%80%E5%B7%A5%E7%A8%8B](https://baike.baidu.com/item/%E4%BA%94%E4%B8%AA%E4%B8%80%E5%B7%A5%E7%A8%8B)

你可能感兴趣的:(Python爬虫学习笔记)