采用requests爬取猫眼电影TOP100通告单

正文所讲的爬虫项目实战属于基础、入门级别,使用的是Python3.5落实的。

  Requests是一个很有利的python网络编程库,用官方的说话是“非转基因,可以安全食用”。里面封装了森的艺术,避免了urllib/urllib2的累赘。

照项目基本对象:在猫眼电影遭拿top100底影片叫,排名,海报,主演,上映时,评分等爬取下来

  这无异于节约以requests库对猫眼电影的TOP100榜进展抓取。

爬虫原理及步子

1 获得页面。

 
首先确定要爬取的url为http://maoyan.com/board/4,通过requests模块,打印出页面的信息

def get_a_page(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:#状态码,200表示请求成功
            return response.text #返回页面信息
        return None
    except RequestException :
        return  None

地方是代码和注释,为了防止再抓取时候出现异常,requests的那个出这些,其中RequestException是死的父类,故我们一直导入

from requests.exceptions import RequestException

作为十分处理。这样即便收获了拖欠url地址的网页内容。

爬虫,就是由网页遭到爬取自己所待的物,如字、图片、视频等,这样咱们虽得读取网页,然后取网页源代码,从源代码中用正则表达式进行匹配,把匹配成功的消息存入相关文档中。这就是爬虫的简便原理。

2 分析页面

  首先看有的页面的大概情况,其中【霸王别姬】就是我们设抓取的栏目,栏目下又分了有的略情,如下面黑色箭头所示。

图片 1

预先押一下页面大致情况,右键【审查元素】

图片 2

足看<dd>标签包裹在各个一个影片之音,用正则表达式找到想使的元素。

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

 

 

逐捕获的凡 排名,地址,名称,主演,时间,整数评分,小数评分。这里自己为此字典的花样储存,返回一个生成器。

items = reg.findall(html)
    for item in items:
        yield{
            "index":item[0],
            "image":item[1],
            "title":item[2],
            "actor":item[3].strip()[3:],
            "time":item[4].strip()[5:],
            "score":item[5]+item[6]
            }

 

操作步骤

3 写副文件

抓取到电影列表,剩下就是是以电影列表写副文件中,由于返回的凡一个字典对象,可以用pickle方法开展序列化,但为了方便以后的查阅,这里用文件方式保留

def write_to_file(contents):
    c = ""
    with codecs.open("result.txt",'a',encoding="utf-8",errors="ignore") as f:
        for key,value in contents.items():
            c += key + ":" + value +"\t"
        f.write(c + "\n")

 

返的凡一个字典格式,可是据json方法开展序列化

def write_to_file(contents):
    with codecs.open("result.txt",'a',encoding="utf-8",errors="ignore") as f:
        f.write(json.dumps(contents,ensure_ascii=False) + '\n')

 

中间的dumps方法是拿obj序列化为JSON格式的字符串,这之中要留心的是编码问题。最后就是抓取整个榜单了,可以在多线程策略,最后的完整代码

# -*- coding: utf-8 -*-

import requests,re
import codecs
from requests.exceptions import RequestException
from multiprocessing import Pool

import json
def get_a_page(url):
    try:
        response = requests.get(url)
        if response.status_code == 200:
            return response.text
        return None
    except RequestException :
        return  None
def parse_a_page(html):
    #排名,地址,名称,主演,时间,评分1,评分2
    reg = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name">'
                     + '<a.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>' 
                     + '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>',re.S)
    items = reg.findall(html)
    for item in items:
        yield{
            "index":item[0],
            "image":item[1],
            "title":item[2],
            "actor":item[3].strip()[3:],
            "time":item[4].strip()[5:],
            "score":item[5]+item[6]
            }


def write_to_file(contents):#这里面两个方法。一种是用json,一种是转为字符串
    c = ""
    with codecs.open("result.txt",'a',encoding="utf-8",errors="ignore") as f:
        #for key,value in contents.items():
            #c += key + ":" + value +"\t"
        f.write(json.dumps(contents,ensure_ascii=False) + '\n')
        #print c
        #f.write(c + "\n")
def main(offset):
    url = "http://maoyan.com/board/4?offset=%s" %offset
    print url
    html = get_a_page(url)
    for item in parse_a_page(html):
        write_to_file(item)

if __name__ == "__main__":
    '''
    for i in range(10):
        main(i*10)
    '''

    pool = Pool()#多线程
    pool.map(main,[i*10 for i in range(10)])

 

1.确定抓取的数额字段(排名,海报,电影叫,主演,上映时,评分)

2.分析页面html标签结构,找到数据所在位置

3.挑选实现方式和数量存储位置(存在于mysql 数据库被)

4.代码写入(requests+re+pymysql)

5.代码调试

 

确定抓取的页面目标URL:http://maoyan.com/board/4

1.导入库/模块

import re,request,pymysql

图片 3

 

2.要头域,在网页中查headers,复制User-Agent内容

图片 4

 

请求一个单页内容以到HTML,定义函数,构建headers,请求成功则代码为200,否则失败重新勾副代码

图片 5

 

3.解析HTML,用正则表达式匹配字符,为非贪婪模式.*?匹配

图片 6

图片 7

 

运行就相当好的第一页内容

图片 8

运转结果尚未拍卖的如下:

图片 9

4.拓展数据处理,格式美化,按字段依次排列,去丢不必要之空格符

图片 10

5.创办MySQL数据库,库名movie1表名maoyan,添加我们爬取的6独字段名

图片 11

 

6.在python中创造数据库连接,把爬取的数量存储到MySQL

图片 12

调用主函数,运行后获得结果如下:

图片 13

 

图片 14

 以上为调取的一样页数据,只有TOP10底影片排名,如果欲获得TOP100,则使重新得到URL来构建

首先页的URL为:http://maoyan.com/board/4

亚页的URL为:http://maoyan.com/board/4?offset=10

老三页的URL为:http://maoyan.com/board/4?offset=20

落页面都是坐10来递增URL为:

url='http://maoyan.com/board/4?offset='+str(offset)
需要循环10次即可得到排名前100的电影,并把它写入到数据库中

图片 15

运行后跻身MySQL查看写副的多寡

图片 16

 以上是爬取猫眼top100完代码,如发生不当请多指教。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图