爬虫毕设(三):爬取动态网页

动态网页分析

按照上一篇的分析,直接使用XPath找到该标签,然后通过parse提取出数据,在写入到item中就完事了。但是,当信心满满的写完代码后却发现,控制台输入了一个简简单单的[]

小问号你是否有很多朋友。

一顿操作猛如虎,一看输出数据无。那么这到底是怎么回事呢?我们从头开始分析。

打开NetWork,找到tv/,点开Preview,结果发现只有一个框架,内容却是空白的。

这是由于网页执行js代码,通过Ajax请求数据来重新渲染页面的。所以我们需要找到有数据的那一个请求,然后再对该请求的目标url爬取。

可以在preview中看到这就是我们想要的数据。

我们再找到该请求的header,找到Request URL。

我们直接复制链接到地址栏中,看到我们想要的数据,这熟悉的格式,不就是json吗。

动手撸代码,爬取这个网页,处理json数据,拿到自己想要的数据。

class tvSpider(scrapy.Spider):
    name = "douban_tv"
    allowed_domain = ["movie.douban.com"]

    def __init__(self, *args, **kwargs):
        super(tvSpider, self).__init__(*args, **kwargs)
        self.start_urls = ["https://movie.douban.com/j/search_subjects?type=tv&tag=热门&sort=recommend&page_limit=20&page_start=0"]

    def parse(self, response):
        results = json.loads(response.body)[‘subjects‘]
        for result in results:
            tv_item = TvListItem()
            url = result[‘url‘]

            tv_item[‘url‘] = url.strip()
            print(url)

这次我们的思路是先拿到每部电视剧的url,然后再回调二次解析的函数获取详细信息。运行爬虫,可以看到我们已经得到了自己想要的结果。

接下在就迭代使用scrapy.Request()请求每一个url,再使用二次解析函数parse_detait获取详细数据。

two years later。经过漫长的debug,终于得到以下代码代码:

    def parse_detail(self, response):
        tv_item = response.meta[‘tv_item‘]
        result = Selector(response)

        # 字符串前加u表示处理中文字符

        # 剧名
        title = result.xpath(u‘//div[@id="content"]/h1/span[1]/text()‘).extract()[0] + result.xpath(‘//div[@id="content"]/h1/span[2]/text()‘).extract()[0]

        # 又名
        has_alias = result.xpath(u‘//div[@id="info"]//span[text()="又名:"]‘).extract()
        if has_alias:
            alias = result.xpath(u‘//div[@id="info"]//span[text()="又名:"]/following::text()[1]‘).extract()[0]
        else:
            alias = ‘‘

        # 图片
        tv_img = result.xpath(‘//a[@class="nbgnbg"]/img/@src‘).extract()[0]

        # 导演
        has_dir = result.xpath(‘//div[@id="content"]//span[text()="导演"]‘)
        if has_dir:
            directors = result.xpath(‘//div[@id="info"]//span[@class="attrs"]//a[@rel="v:directedBy"]/text()‘)
            director_lsit = directors.extract()
            director = ‘/‘.join(director_lsit)

        # 主演
        all_actors = result.xpath(‘//div[@id="info"]//span[@class="attrs"]//a[@rel="v:starring"]/text()‘)
        actors_list = all_actors[:5].extract()
        actors = ‘/‘.join(actors_list)

        # 类型
        tv_types = result.xpath(‘//div[@id="info"]//span[@property="v:genre"]/text()‘)
        type_list = tv_types.extract()
        tv_type = ‘/‘.join(type_list)

        # 制片地区或国家
        country_or_region = result.xpath(u‘//div[@id="info"]//span[text()="制片国家/地区:"]/following::text()[1]‘).extract()[0]

        # 首播
        first_time = result.xpath(‘//div[@id="content"]//span[@property="v:initialReleaseDate"]/text()‘).extract()[0]

        # 集数
        series = result.xpath(u‘//div[@id="content"]//span[text()="集数:"]/following::text()[1]‘).extract()[0]

        # 单集
        has_single = result.xpath(‘//div[@id="content"]//span[text()="单集片长:"]‘)
        if has_single:
            single = result.xpath(u‘//div[@id="content"]//span[text()="单集片长:"]/following::text()[1]‘).extract()[0]

        # 评分
        rate = result.xpath(‘//strong/text()‘).extract()[0]

        # 评分人数
        votes_num = result.xpath(‘//span[@property="v:votes"]/text()‘).extract()[0]

        # 简介
        synopsis = result.xpath(‘//span[@property="v:summary"]/text()‘).extract()[0].strip()

        tv_item[‘title‘] = title.strip()
        tv_item[‘alias‘] = alias.split()
        tv_item[‘tv_img‘] = tv_img.strip()
        tv_item[‘director‘] = director.strip()
        tv_item[‘actors‘] = actors.strip()
        tv_item[‘tv_type‘] = tv_type.strip()
        tv_item[‘country_or_region‘] = country_or_region.strip()
        tv_item[‘first_time‘] = first_time.strip()
        tv_item[‘series‘] = series.strip()
        tv_item[‘single‘] = single.strip()
        tv_item[‘rate‘] = rate.strip()
        tv_item[‘votes_num‘] = votes_num.strip()
        tv_item[‘synopsis‘] = synopsis

        print(‘电视剧信息>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>‘)
        print(‘剧名:‘ + title)
        print(‘又名:‘ + alias)
        print(‘海报:‘ + tv_img)
        print(‘导演:‘ + director)
        print(‘主演:‘ + actors)
        print(‘类型:‘ + tv_type)
        print(‘制片国家或地区:‘ + country_or_region)
        print(‘首播:‘ + first_time)
        print(‘集数:‘ + series)
        print(‘单集时长:‘ + single)
        print(‘评分:‘ + rate)
        print(‘评分人数:‘ + votes_num)
        print(‘简介:‘ + synopsis)

然后整整二十部电视剧的简介疯狂刷屏:

虽然经历了一番腰酸背痛,头眼昏花,问题好歹是解决了。

原文地址:https://www.cnblogs.com/bzsheng/p/12616967.html

时间: 2024-08-18 19:25:03

爬虫毕设(三):爬取动态网页的相关文章

爬取动态网页中关于构造浏览器头的注意事项

在原来爬取动态网页图片中,获取到了图片的实际地址,但是下载下来的图片是损坏的,究其原因,是服务器端阻止了访问,但是观察发现 headers = {'User-Agent': random.choice(UserAgent_List), 'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", 'Accept-Encoding': 'gzip', } 浏览器头已经构造好了

python爬取动态网页

静态网页:根据url即可方便的爬取 动态网页:分为两种:一种是通过F12查看控制台的xhr等文件,找到包含所要爬取的内容的文件,发现这个文件的url路径跟页码有联系,那么就可以根据构造的url来进行访问爬取了.还有一种情况是查看了包含所要爬取内容的文件,发现文件url是固定不变的或者跟页码没有关系,这个时候可以通过简单的模拟浏览器点击行为来请求网页再爬取,这种方案执行效率较慢,不适于多页爬取的情况.代码如下: 1 def parse(self, response): 2 print 'parse

利用selenium并使用gevent爬取动态网页数据

首先要下载相应的库 gevent协程库:pip install gevent selenium模拟浏览器访问库:pip install selenium selenium库相应驱动配置  https://www.cnblogs.com/Niuxingyu/p/10490882.html #导包 import gevent #猴子补丁 from gevent import monkey monkey.patch_all() import requests import os import re f

爬取动态网页:Selenium

参考:http://blog.csdn.net/wgyscsf/article/details/53454910 概述 在爬虫过程中,一般情况下都是直接解析html源码进行分析解析即可.但是,有一种情况是比较特殊的:网页的数据采用异步加载的,比如ajax加载的数据,在我们“查看网页源代码”是查看不到的.采用常规的爬虫这一块是解析不到的. 第一种解决方案是采用一些第三方的工具,模拟浏览器的行为,去加载数据.比如:Selenium.PhantomJs. 优点:不必考虑动态页面的各种变化多端(无论动态

python scrapy爬取动态页面

preface:最近学习工作之外,有个异性朋友需要爬取动态网页的要求,输入关键词爬取某个专利网站在该关键词下的一些专利说明.以往直接python urllib2可破,但是那只是对于静态网页可破,但是对于用js等其他的生成的动态网页的话,则貌似不行(没试过).然后在网上找了些资料,发现scrapy结合selenium包好像可以.(之所以这么说,暂时卤主也还没实现,先记录下来.) #=====================根据官网中简单的介绍作个人理解=======================

使用htmlparse爬虫技术爬取电影网页的全部下载链接

昨天,我们利用webcollector爬虫技术爬取了网易云音乐17万多首歌曲,而且还包括付费的在内,如果时间允许的话,可以获取更多的音乐下来,当然,也有小伙伴留言说这样会降低国人的知识产权保护意识,诚然,我们的重点在于如何灵活运用我们已学的技术,这就需要我们不断的练习,不停的思索和深入发掘,在了解了精髓和意义之后运用到实践中才是技术的最高境界. 今天呢,本着昨天的兴趣,想来爬一爬电影资源,中途为了找一个好用趁手的工具,也是费了不少心思,早上半天基本上都在学习和找资料的过程中度过,下午开始才进入状

scrapy爬虫框架(四)-爬取多个网页

scrapy爬虫框架(四) 爬取多个网页 思路:通过判断句子控网站中,下一页是否还有a标签来获取网址,拼接后继续爬取,最终写入json文件中. juziSpider.py # -*- coding: utf-8 -*- import scrapy from juzi.items import JuziItem class JuzispiderSpider(scrapy.Spider): name = 'juziSpider' allowed_domains = ['www.juzikong.co

Scrapy抓取动态网页

动态网页指几种可能: 1)需要用户交互,如常见的登录操作: 2)网页通过JS/ AJAX动态生成,如一个html里有<div id="test"></div>,通过JS生成<div id="test"><span>aaa</span></div>: 3)点击输入关键字后进行查询,而浏览器url地址不变 本篇文章不借助任何外部工具,实例操作如何以观察网络通信的方法解析动态网页. 环境:Win10

教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

欢迎加入Python学习交流群:535993938  禁止闲聊 ! 名额有限 ! 非喜勿进 ! 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http://www.xiaohuar.com/,让你体验爬取校花的成就感. Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrapy吸引人的地方在于