zoukankan      html  css  js  c++  java
  • python网络爬虫入门(二)

    刚去看了一下,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 = 

    '<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
    ', res[0].string)

    结果:

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

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


    后记

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

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

  • 相关阅读:
    关于content-type请求头的说明
    RabbitMQ
    tornado
    flask总结之session,websocket,上下文管理
    爬虫相关问题总结
    爬虫之scrapy框架
    爬虫之Selenium模块
    爬虫之Beautifulsoup及xpath
    爬虫之requests
    SQLAlchemy
  • 原文地址:https://www.cnblogs.com/yocichen/p/11864915.html
Copyright © 2011-2022 走看看