【内推字节】欢迎简历chengxinsong@bytedance.com

【python3】python爬虫的简单入门例子

前言

最近在看python,并且学习使用他作为前端开发的补充语言,python2已经官方废弃维护,很多项目也表示不支持python2。

欢迎关注微信公众号“松宝写代码”。目的:songEagle开发知识体系构建,技术分享,项目实战,项目实验室,带你一起学习新技术,总结学习过程,让你进阶到高级资深工程师,学习项目管理,思考职业发展,生活感悟,充实中成长起来。
介绍

目标分析

我们提取一下豆瓣电影--电影名称,评分,图片的信息。

提取的站点URL:https://movie.douban.com/cinema/nowplaying/nanjing/

爬取结果我们以文件形式保存下来。

技术分析

利用requests库正则表达式来抓取豆瓣电影的相关内容

首先确保正确安装requests库,可以通过pip3这个包管理器工具来安装

安装命令:

pip3 install requests

安装requests

实际爬取分析

1、爬取源代码

提取的站点URL:https://movie.douban.com/cinema/nowplaying/nanjing/

打开之后便可以查看到正在上映的电影信息

页面显示的有效信息有影片名称,评分,图片等信息。我们就可以获取这个页面结果之后,再用正则表达式提取相应信息就可以。

豆瓣电影1

接下来,我们实现爬取页面源代码过程:

  • 实现一个getPage方法,传入url作为参数,然后将爬取结果返回。
  • 再实现一个main方法,调用getPage方法。

大致代码:

def getPage(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None


def main():
    url = "https://movie.douban.com/cinema/nowplaying/nanjing/"
    html = get_page(url)
    for item in parse_page(html):
        print(item)
        write_to_file(item)        

2、正则提取电影信息

因为这个是后端返回的页面源码,为了SEO,实现服务端渲染。

我们在上图中有源码:前端div的div结构。

不要右键查看源码,因为这样的源码可能已经经过ja操作,与原始请求的页面不一样。
我们从network选项中看原始请求得到的源码。

我们看一下一个条目的源码div结构:

豆瓣电影2

分析:我们发现一部电影信息对应源代码是一个li节点,我们使用正则表达式来提取这里的一些电影信息。
首先我们提取电影名称,电影名称信息在class为list-item的节点后,
所以我们利用非贪婪匹配提取data-title属性的信息,正则表达式:

<li.*?list-item.*?data-title="(.*?)".*?>

我们使用相同判断方法提取data-score属性的信息,正则为:

<li.*?list-item.*?data-title="(.*?)".*?data-score="(.*?)".*?>.&?<img.*?src="(.*?)".*?/>

这样我们一个正则表达式可以匹配一部电影结果。含有3个信息。

接下来我们通过调用findall方法提取出所有的内容,实现一个regExpPage方法。如下:

def regExpPage(html):
    pattern = re.compile('<li.*?list-item.*?data-title="(.*?)".*?data-score="(.*?)".*?>.*?<img.*?src="(.*?)".*?/>', re.S)
    items = re.findall(pattern, html)
    for item in items:
        yield{
            'title': item[0],
            'score': item[1],
            'image': item[2],
        }

3、写入文件

我们将爬取的结果写入文件,写入到一个文本中,通过json库的dumps()方法实现字典的序列化,指定
ensure_ascii 参数为 False,这样可以保证输出的结果是中文形式而不是 Unicode 编码。

def writeToFile(content):
    with open('xiaoxi.txt', 'a', encoding='utf-8')as f:
        print(type(json.dumps(content)))
        f.write(json.dumps(content,ensure_ascii=False))

通过调用 write_to_json() 方法即可实现将字典写入到文本文件的过程,此处的 content 参数就是一部电影的提取结果,是一个字典。

完整的代码

import json
import re
import requests
from requests import RequestException

def getPage(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException:
        return None

def regExpPage(html):
    pattern = re.compile('<li.*?list-item.*?data-title="(.*?)".*?data-score="(.*?)".*?>.*?<img.*?src="(.*?)".*?/>', re.S)
    items = re.findall(pattern, html)
    for item in items:
        yield{
            'title': item[0],
            'score': item[1],
            'image': item[2],
        }

def writeToFile(content):
    with open('python_douban_movie.txt', 'a', encoding='utf-8')as f:
        # print(type(json.dumps(content)))
        f.write(json.dumps(content,sort_keys=True,indent=2,ensure_ascii=False))

def main():
    url = "https://movie.douban.com/cinema/nowplaying/nanjing/"
    html = getPage(url)
    for item in regExpPage(html):
        print(item)
        writeToFile(item)

if __name__ == '__main__':
    main()

运行结果

豆瓣电影运行

再看下文本文件,结果如图所示:

豆瓣电影运行

最后

作者简介

昵称:saucxs | songEagle | 松宝写代码

github:https://github.com/saucxs

一、技术产品:

二、开源作品:


感谢你的阅读,本文由 sau交流学习社区 版权所有。
如若转载,请注明出处:sau交流学习社区-power by saucxs(程新松)(/page/851.html)
交流咨询
    官方QQ群
    群号663940201,欢迎加入!
    sau交流学习社区交流群

微信群
欢迎加入微信群
微信公众号
欢迎关注微信公众号

图文推荐

微信群
saucxs聊天机器人
saucxs
hi ,欢迎来到sau交流学习社区,欢迎与我聊天,问我问题哦!
您正在使用的浏览器是,不在支持范围内!
为了您的正常使用与展示,推荐使用Chrome浏览器68以上版本
支持浏览器:
火狐浏览器最新版
Safari浏览器最新版
Edge浏览器最新版
IE浏览器10,11