第一个Python小爬虫

232 阅读4分钟
原文链接: mp.weixin.qq.com

上一篇文章学习了Python Requests的使用,其中博客中还包括了正则表达式的使用,本篇文章是对前几篇文章的实践,写一个猫眼电影TOP100的爬虫。包括从网页分析,正则编写,数据转换,数据保存。下面就来详细说明。

分析网页

打开网站猫眼电影TOP100,打开开发者工具,查看网页源代码,找到列表代码,也可以直接看下边的代码。

  1. <dd>

  2.    <i class="board-index board-index-4">4</i>

  3.    <a href="/films/4055" title="这个杀手不太冷" class="image-link" data-act="boarditem-click" data-val="{movieId:4055}">

  4.        <img src="//ms0.meituan.net/mywww/image/loading_2.e3d934bf.png" alt="" class="poster-default">

  5.        <img alt="这个杀手不太冷" class="board-img" src="http://p0.meituan.net/movie/fc9d78dd2ce84d20e53b6d1ae2eea4fb1515304.jpg@160w_220h_1e_1c">

  6.    </a>

  7.    <div class="board-item-main">

  8.        <div class="board-item-content">

  9.            <div class="movie-item-info">

  10.                <p class="name">

  11.                    <a href="/films/4055" title="这个杀手不太冷" data-act="boarditem-click" data-val="{movieId:4055}">这个杀手不太冷</a>

  12.                </p>

  13.                <p class="star">

  14.                    主演:让·雷诺,加里·奥德曼,娜塔莉·波特曼

  15.                </p>

  16.                <p class="releasetime">上映时间:1994-09-14(法国)</p>

  17.            </div>

  18.            <div class="movie-item-number score-num">

  19.                <p class="score">

  20.                    <i class="integer">9.</i>

  21.                    <i class="fraction">5</i>

  22.                </p>

  23.            </div>

  24.        </div>

  25.    </div>

  26. </dd>

我们要从列表中过滤出图片,标题,时间,主演,位置以及评分。分析网页我们得出正则表达式为

  1. <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>

编写爬虫

  1. import requests

  2. import re

  3. import json

  4. import time

  5. def get_one_page(url):

  6.    headers = {

  7.    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'

  8.    }

  9.    response = requests.get(url,headers=headers)

  10.    if response.status_code == 200:

  11.        return response.text

  12.    return None

  13. def parse_one_page(html):

  14.    pattern = re.compile(

  15.        '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>', re.S)

  16.    items = re.findall(pattern, html)

  17.    for item in items:

  18.        yield {

  19.            'index': item[0],

  20.            'image': item[1],

  21.            'title': item[2].strip(),

  22.            'actor': item[3].strip()[3:] if len(item[3]) > 3 else '',

  23.            'time': item[4].strip()[5:] if len(item[4]) > 5 else '',

  24.            'score': item[5].strip() + item[6].strip()

  25.        }

  26. def write_to_json(content):

  27.    with open('result.json','ab') as f:

  28.        f.write(json.dumps(content, ensure_ascii=False,).encode('utf-8'))

  29. def main(offset):

  30.    url = 'http://maoyan.com/board/4?offset='+str(offset)

  31.    html = get_one_page(url)

  32.    for item in  parse_one_page(html):

  33.        print(item)

  34.        write_to_json(item)

  35. if __name__ == '__main__':

  36.    for i in range(10):

  37.        main(offset=i*10)

  38.        time.sleep(1)

我们一步步分析上面的代码

  • get_one_page :  根据url爬取网页源代码。

  • parse_one_page :  根据正则表达式,从网页中得到我们想要的内容。

  • write_to_json :  将得到的数据写入文本。

  • main :  循环获取网页数据。因为总共有一百条数据,而页面内容根据url路径改变。

结果

  1. {

  2.    "time": "1993-01-01(中国香港)",

  3.    "image": "http://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c",

  4.    "title": "霸王别姬",

  5.    "score": "9.6",

  6.    "index": "1",

  7.    "actor": "张国荣,张丰毅,巩俐"

  8. } {

  9.    "time": "1994-10-14(美国)",

  10.    "image": "http://p0.meituan.net/movie/__40191813__4767047.jpg@160w_220h_1e_1c",

  11.    "title": "肖申克的救赎",

  12.    "score": "9.5",

  13.    "index": "2",

  14.    "actor": "蒂姆·罗宾斯,摩根·弗里曼,鲍勃·冈顿"

  15. }

至此我们的第一个小爬虫算是完事了。明天尝试抓雪球首页新闻数据。后续可以尝试着抓取大佬的实盘操作,当对方股票,仓位有任何调整就第一时间发送通知到手机,及时进行操作。


欢迎长按下图 -> 识别图中二维码或者微信扫一扫关注我的公众号