2019-03-21

准备工作

首先应当安装有Python3环境的机器,还要安装requests,lxml库,编译器呢我选择的是PyCharm。

这里是猫眼网Top100榜的界面

2019-03-21_第1张图片
image

代码部分

首先定义一个类,然后定义一个发送请求的方法,利用requests库模拟发送请求,并加上简单的反爬机制.

import requests


class Spider(object):
    def start_requests(self):
        headers ={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0"}
        response = requests.get("https://maoyan.com/board/4",headers=headers)
        print(response.text)
        
spider=Spider()
spider.start_requests()     

然后我们就能得到返回的网页信息,截取其中我们需要的信息.

2019-03-21_第2张图片
image

然后分析源码,写出对应的xpath语法来获取我们所需要的信息,使用xpath语法需要导入lxml库,这个就不再过多叙述,直接看代码

import requests
from lxml import etree


class Spider(object):
    def start_requests(self):
        headers ={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0"}
        response = requests.get("https://maoyan.com/board/4",headers=headers)
        html = etree.HTML(response.text)
        ranking_list = html.xpath('//dl[@class="board-wrapper"]/dd/i/text()')
        print(ranking_list)
        title_list = html.xpath('//div[@class="movie-item-info"]/p[1]/a/text()')
        print(title_list)
        star_list = html.xpath('//div[@class="movie-item-info"]/p[2]/text()')
        print(star_list)
        releasetime_list = html.xpath('//div[@class="movie-item-info"]/p[3]/text()')
        print(releasetime_list)


spider = Spider()
spider.start_requests()

这时我们就已经获得了需要的数据

2019-03-21_第3张图片
image

这时的数据并未一一对应,所以我们使用zip方法使他们一一对应起来,然后进行输出,可是Python3中zip的使用方法稍有改变,想要输出zip中的数据
需要将其转换为列表,否则输出的是一个对象,详情参见Python3 zip()函数.

print(list(zip(ranking_list, title_list, star_list, releasetime_list)))
image

可是这时候就又有一个新的问题出现了,主演前面有"\n"和空格字符,不要急,一会就使用一个方法把字符切掉。

下面我们将数据已json的格式进行储存,不要忘记导入json库

 for ranking, title, star, releasetime in zip(ranking_list, title_list, star_list, releasetime_list):
            items = {"排名:": ranking,"标题:":title,"主演:":star.strip(),"上映时间:":releasetime}
            content = json.dumps(items, ensure_ascii=False) + "\n"
            with open("maoyantop.json","a",encoding="utf-8") as f:
                f.write(content)

嘿嘿,同学们发现什么不一样的地方了吗,就是strip()方法来去除多余字符

这样我们就成功拿到了第一页的数据,生成了一个名为maoyantop的json文件

[图片上传失败...(image-ea168e-1553136318441)]

可是我们要拿到所有的数据那,这时候我们观察一下换页时链接的规律

[图片上传失败...(image-2209ad-1553136318441)]

由此我们发现点击第二页是链接中多出了offset=10,第三页中offset=20,我们就找到了规律,所以使用range()函数和for循环进行多页数据的处理

完整代码如下

import requests
from lxml import etree
import json


class Spider(object):
    def multipage(self):
        for i in range(0,91,10):
            url = 'https://maoyan.com/board/4?offset=' + str(i)
            self.start_requests(url)
    def start_requests(self,url):
        headers ={"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0"}
        response = requests.get(url,headers=headers)
        html = etree.HTML(response.text)
        ranking_list = html.xpath('//dl[@class="board-wrapper"]/dd/i/text()')
        title_list = html.xpath('//div[@class="movie-item-info"]/p[1]/a/text()')
        star_list = html.xpath('//div[@class="movie-item-info"]/p[2]/text()')
        releasetime_list = html.xpath('//div[@class="movie-item-info"]/p[3]/text()')
        print(list(zip(ranking_list, title_list, star_list, releasetime_list)))
        for ranking, title, star, releasetime in zip(ranking_list, title_list, star_list, releasetime_list):
            items = {"排名:": ranking,"标题:":title,"主演:":star.strip(),"上映时间:":releasetime}
            content = json.dumps(items, ensure_ascii=False) + "\n"
            with open("maoyantop.json","a",encoding="utf-8") as f:
                f.write(content)


spider = Spider()
spider.multipage()

爬取数据如下

[图片
2019-03-21_第4张图片
paqushuju.png

总结

到此我们的程序大工告成,其中最主要的部分就是requests库的使用和对xpath语法.
有什么问题欢迎在下方留言哦!

你可能感兴趣的:(2019-03-21)