刚去看了一下,18年2月份写了第一篇关于爬虫的文章(仅仅介绍了使用requests库去获取HTML代码),一年多之后看来很稚嫩也没有多少参考的意义,但没想着要去修改它,留着也是一个回忆吧。至少证明着我是有些许进步的,愿你也是一样!

下面是它的姊妹篇,介绍使用requests和bs4(BeautifulSoup)库来爬取静态网页中的信息。


爬虫从黑盒的角度来看,就是给出网页的链接,输出你想要的信息的一段程序。大概会涉及这几个步骤:

1. 使用requests+re正则

单纯使用requests库来做,需要会写正则表达式,这里借助之前的那篇 爬取猫眼Top100榜单 来讲。

第一步——获取HTML代码

一般使用requests库get()方法,这里封装成为一个函数

  1. def get_one_page(url):
  2. try:
  3. headers = {
  4. 'user-agent':'Mozilla/5.0'
  5. }
  6. # use headers to avoid 403 Forbidden Error(reject spider)
  7. response = requests.get(url, headers=headers)
  8. if response.status_code == 200 :
  9. return response.text
  10. return None
  11. except RequestException:
  12. return None

第二部——分析页面HTML代码,写正则表达式,提取信息

先来看页面

分析它的HTML,我目前需要排名、片名、主演、上映时间和评分信息。

可以看到,榜单中每一个电影条目都在一组<dd></dd>标签中,而且所需的信息也很明确,我们来写正则,正则的关键在于找好独一无二的参照(已在途中方格标出)

re_text =

  1. '<dd>.*?board-index.*?>(\d+)<.*?<a.*?title="(.*?)"'
    +'.*?data-src="(.*?)".*?</a>.*?star">[\\s]*(.*?)[\\n][\\s]*</p>.*?'
    +'releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?'
    +'fraction">(.*?)</i>.*?</dd>'
  1. def parse_one_page(html):
  2. pattern = re.compile('<dd>.*?board-index.*?>(\d+)<.*?<a.*?title="(.*?)"'
  3. +'.*?data-src="(.*?)".*?</a>.*?star">[\\s]*(.*?)[\\n][\\s]*</p>.*?'
  4. +'releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?'
  5. +'fraction">(.*?)</i>.*?</dd>', re.S)
  6. items = re.findall(pattern, html)
  7. return items

先编译正则表达式成为pattern,然后在页面中findall符合条件的信息。这样就会将正则表达式匹配到的所有信息,以一个列表的形式返回。

第三部——持久化存储数据

我所做的实践由于数据量较小,目前都是采用excel(*.xlsx)来存储。需要用到一个openpyxl库,自行安装即可,它的使用教程有很多,不是我所述的主要内容,烦请自行学习。

已经爬到的数据

注意:上面所讲的是获取一个页面(含20条信息,该榜单有100条,势必会有分页),所以URL肯定需要替换,但是肯定是有规律的(具体的看这篇博客吧 猫眼top100

2. 使用bs4(BeautifulSoup)筛选器

使用bs4库,需要先自己安装一下。

所谓筛选器,即相当于我们上面正则表达式中的“参考”,即:锚点。通过筛选器,可以非常方便的获取页面当中的信息。下面讲一个例子,就明白了。

栗子:

获取博客园新闻板块第一条的新闻title,先来瞧瞧HTML和selector。

代码:

  1. # -*- coding: utf-8 -*-
  2. # @Author : yocichen
  3. # @Email : yocichen@126.com
  4. # @File : test_bs4.py
  5. # @Software: PyCharm
  6. # @Time : 2019/11/15 10:23
  7.  
  8. import requests
  9. from bs4 import BeautifulSoup
  10. import lxml
  11.  
  12. url = 'https://www.cnblogs.com/news/'
  13. headers = {
  14. 'user-agent':'Mozilla/5.0'
  15. }
  16. # 获取HTML
  17. html = requests.get(url, headers=headers)
  18. # 解析HTML
  19. soup = BeautifulSoup(html.text, 'lxml')
  20. # 筛选器筛选信息
  21. selector = '#post_list > div:nth-child(2) > div.post_item_body > h3 > a'
  22. res = soup.select(selector)
  23. print('博客园新闻板块第一条title\n', res[0].string)

结果:

可以看到,获取selector十分简单,chrome浏览器或者其他浏览器也有支持,这样一来就避免了去写繁杂的正则表达还写不出来的窘境。

最终的持久化存储过程,同上,不再赘述。


后记

python爬虫入门篇就此结束了,爬虫深入的话还涉及到防止反爬,以及爬取动态页面等问题,有机会的话会再学习再写一篇。

以上内容其实是对我最近所学所做的总结,如果你从中也有些许收获,不妨点个“推荐”吧!

python网络爬虫入门(二)的更多相关文章

  1. python网络爬虫入门范例

    python网络爬虫入门范例 Windows用户建议安装anaconda,因为有些套件难以安装. 安装使用pip install * 找出所有含有特定标签的HTML元素 找出含有特定CSS属性的元素 ...

  2. Python简单爬虫入门二

    接着上一次爬虫我们继续研究BeautifulSoup Python简单爬虫入门一 上一次我们爬虫我们已经成功的爬下了网页的源代码,那么这一次我们将继续来写怎么抓去具体想要的元素 首先回顾以下我们Bea ...

  3. python 网络爬虫(二) BFS不断抓URL并放到文件中

    上一篇的python 网络爬虫(一) 简单demo 还不能叫爬虫,只能说基础吧,因为它没有自动化抓链接的功能. 本篇追加如下功能: [1]广度优先搜索不断抓URL,直到队列为空 [2]把所有的URL写 ...

  4. python 网络爬虫(二)

    一.编写第一个网络爬虫 为了抓取网站,我们需要下载含有感兴趣的网页,该过程一般被称为爬取(crawling).爬取一个网站有多种方法,而选择哪种方法更加合适,则取决于目标网站的结构. 首先探讨如何安全 ...

  5. python网络爬虫-入门(二)

    为什么要学网络爬虫 可以替代人工从网页中找到数据并复制粘贴到excel中,这种重复性的工作不仅浪费时间还一不留神还会出错----解决无法自动化和无法实时获取数据     对于这些公开数据的应用价值,我 ...

  6. Python网络爬虫入门篇

    1.  预备知识 学习者需要预先掌握Python的数字类型.字符串类型.分支.循环.函数.列表类型.字典类型.文件和第三方库使用等概念和编程方法. 2. Python爬虫基本流程 a. 发送请求 使用 ...

  7. Python网络爬虫入门实战(爬取最近7天的天气以及最高/最低气温)

    _ 前言 本文文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Bo_wen   最近两天学习了一下python,并自己写了一个 ...

  8. python网络爬虫-入门(一)

    前言 1.爬虫程序是Dt(Data Technology,数据技术)收集信息的基础,爬取到目标网站的资料后,就可以分析和建立应用了. 2.python是一个简单.有效的语言,爬虫所需要的获取.存储.整 ...

  9. python网络爬虫入门(一)

    python网络爬虫(一) 2018-02-10 python版本:python 3.7.0b1 IDE:PyCharm 2016.3.2 涉及模块:requests  &  builtwit ...

随机推荐

  1. python去除BOM头\ufeff等特殊字符

    1.\ufeff 字节顺序标记 去掉\ufeff,只需改一下编码就行,把UTF-8编码改成UTF-8-sigwith open(file_path, mode='r', encoding='UTF-8 ...

  2. svg的viewport和viewbox

    svg中视区重要的概念 1. viewport  视口,相当于显示器屏幕 2. viewbox   视区,相当于在屏幕上截取一小块,放大到整个屏幕,就是特写的效果 3. preserveAspectR ...

  3. BladeX 2.0.7.RELEASE版本git后,在idea中导入项目,结果无法运行FlowApplication等几个服务的错误

    问题:2.0.7.RELEASE版本git后,在Intellij IDEA运行项目,结果无法运行FlowApplication等几个服务的错误 描述:打开IDEA,点击Check out from V ...

  4. LeetCode_441. Arranging Coins

    441. Arranging Coins Easy You have a total of n coins that you want to form in a staircase shape, wh ...

  5. Swift编码总结7

    1.Git 打Tag: 命令也就下面两条,看看就会了. 2.字符串转Model:JSONDecoder http://www.cocoachina.com/ios/20180612/23771.htm ...

  6. docker 删除含有指定字符的container

    docker container ls -a|grep 指定字符 | awk '{print $1}'| xargs -I{} docker rm {}

  7. [LeetCode] 388. Longest Absolute File Path 最长的绝对文件路径

    Suppose we abstract our file system by a string in the following manner: The string "dir\n\tsub ...

  8. Google Drive网盘文件直链获取一键脚本

    说明:本脚本可以将Google Drive网盘的文件分享链接或者文件ID变成直链,方便我们在很多情况下调用.只支持文件分享,不支持文件夹.文件分享ID为26到48位.   使用 1.需求 wget.g ...

  9. 使用transform后z-index失效的解决方法

    transform作用的元素增加translateZ,父级元素增加 transform-style: preserve-3d; <div class="father"> ...

  10. Linux安装卸载JDK完整步骤

    1.检查一下系统中的jdk版本 [root@localhost software]# java -version 显示: openjdk version "1.8.0_102" O ...