requests_html爬虫小练习

爬取豆瓣TOP250

from requests_html import HTMLSession

#新建一个html文件,将相应的代码放入,运行查看结果,如果页面全部渲染则直接根据页面信息获得数据;
#如果指定部分没有代码,则是通过ajax提交渲染的结果,需要通过控制台找到指定的后台接口
#session=HTMLSession()
# r=session.get('https://movie.douban.com/top250')
# print(r.text)


class douban250():
    def __init__(self):
        self.session=HTMLSession()
        #请求头,根据请求网页决定是否需要
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
        }

    #请求路径,一共十页每页25条数据
    def get_url(self):
        for i in range(10):
            #这里一定要注意要将i*25放在括号内,否则数据会出错
            yield 'https://movie.douban.com/top250?start=%s&filter=' % (i*25)



    def get_data(self,url):
        r=self.session.get(url=url,headers=self.headers)
        elements_list=r.html.find('li .item>.pic')
        for element in elements_list:
            #电影详情链接
            links_url=element.find('a',first=True).attrs.get('href')
            #电影排名
            range=element.find('em',first=True).text
            #电影名
            mov_name=element.find('a>img',first=True).attrs.get('alt')
            #电影封面
            img_url=element.find('a>img',first=True).attrs.get('src')
            print(range,mov_name)
            print(links_url)
            yield img_url,mov_name

    def save_img(self,img_url,img_name):
        r=self.session.get(img_url)
        img_path=os.path.join('豆瓣250图片',img_name+'.jpg')
        with open(img_path,'wb') as f:
            f.write(r.content)
            print('%s下载完毕'%img_name)


    #运行函数,获得路径
    def run(self):
        for url in self.get_url():
            for img_url,mov_name in self.get_data(url):
                self.save_img(img_url,mov_name)

if __name__ == '__main__':
    a=douban250()
    a.run()

爬取校花网图片

from requests_html import HTMLSession
import os


class spider():
    def __init__(self):
        self.session = HTMLSession()
        self.headers = {
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
        }

    def get_index_url(self):
        for i in range(1,4):
            #因为第一个页面是没有页面索引的
            if i == 1:
                yield 'http://www.xiaohuar.com/meinv/index.html'
            else:
                yield 'http://www.xiaohuar.com/meinv/index_%s.html'%i

    def get_img_name(self,index_url):
        r = self.session.get(url=index_url,headers=self.headers)
        elements_list = r.html.find('#images .items')
        for element in elements_list:
            img_url:str = element.find('img',first=True).attrs.get('src')
            #因为爬取得数据有些是绝对路径有些是相对路径,所有需要拼接
            if not img_url.startswith('http'):
                img_url = 'http://www.xiaohuar.com' + img_url
            #文件名不能出现左斜杠或者右斜杠,空格没问题
            img_name = element.find('.p_title>a',first=True).text.replace('\\','').replace('/','') + '.jpg'
            yield img_url,img_name


    def save_img(self,img_url,img_name):
        r = self.session.get(url=img_url)
        #新建一个存放图片的文件夹名叫‘校花图片’
        img_path= os.path.join('校花图片',img_name)
        with open(img_path,'wb') as f:
            f.write(r.content)
            print('%s下载完毕'%img_name)




    def run(self):
        for index_url in self.get_index_url():
            for img_url,img_name in self.get_img_name(index_url):
                self.save_img(img_url,img_name)


if __name__ == '__main__':
    xiaohua = spider()
    xiaohua.run()

爬取豆瓣电影分类页面

import requests_html

#新建一个html文件,将相应的代码放入,运行查看结果,如果页面全部渲染则直接根据页面信息获得数据;
#如果指定部分没有代码,则是通过ajax提交渲染的结果,需要通过控制台找到指定的后台接口
# session=requests_html.HTMLSession()
# url='https://movie.douban.com/tag/#/?sort=U&range=0,10&tags=2018'
# r=session.get(url)
# print(r.text)

class spider():
    def __init__(self):
        #通过控制器NETWORK的XHR也就是json格式的数据找到的接口路径,注意结尾加问号
        self.api='https://movie.douban.com/j/new_search_subjects?'
        self.session=requests_html.HTMLSession()

    def get_params(self):
        year_range=input('请输入年份')
        sort=input('请输入排序规则(S按评分)')
        countries=input('请输入电影的制作国家')
        tags=input('请输入标签(如经典)')
        print('tags:',tags)

        self.params={
            'year_range':year_range,
            'sort':sort,
            'start':0,
            # 'country':str(countryies.encode('utf8')).strip('b\'').replace('\\x','%').upper()
            'countries':countries,
            'tags':tags
        }

    def get_data(self):
        for i in range(1):
            #点击加载更多按键,每次加载20条数据
            self.params['start']=i*20
            r=self.session.get(url=self.api,params=self.params)
            print(r.json())

    def run(self):
        self.get_params()
        self.get_data()

if __name__ == '__main__':
    douban=spider()
    douban.run()
posted @ 2019-10-24 20:24  Firekeeper  阅读(238)  评论(0编辑  收藏  举报