美文网首页
爬豆瓣豆列

爬豆瓣豆列

作者: ddm2014 | 来源:发表于2018-09-21 22:55 被阅读0次

    目的:把精彩豆列频道里的每个豆列里的内容抓取出来。
    流程是抓取目录页精彩豆列频道豆列的地址-对每个豆列所有页数都抓取具体内容、网址、时间。
    这就很标准crawlspider干的活了,把目录页的地址写成start_request依次爬取,然后对每个豆列都用rules控制。

    图片.png
    图片.png
    目录页的分析:
    豆瓣豆列挺有意思,没做分页,直接js获取数据,json数据又长得像html的样子,没别的参数非常好爬。
    json长这样:

    request
    有了这两项就可以想提取多少就提取多少豆列地址了,我做了前200个。
    import scrapy
    from scrapy.spiders import CrawlSpider,Rule
    from scrapy.linkextractors import LinkExtractor
    from pyquery import PyQuery as pq
    import requests
    from douban.items import DoubanItem
    import logging
    
    class DbSpider(CrawlSpider):
        name = 'db'
        # allowed_domains = ['douban.com/doulist/']
        
        rules = (Rule(
            LinkExtractor(allow ='\?start'), callback = 'parse_detail', follow = True),)
    
        # restrict_xpaths = ('//*[@id="content"]/div/div[1]/div[25]/a')
        def start_requests(self):
            url = 'https://www.douban.com/j/doulist/doulists?start=0&limit=200'
            res = requests.get(url)
            cont = pq(res.json()['html'])
            for item in cont('.doulist-item').items():
                logging.info(item('.title a').attr('href'))
                yield scrapy.Request(item('.title a').attr('href'))
    
        def parse_detail(self, response):
            logging.info(response.url)
    
            res = pq(response.body)
            for item in res('.doulist-item .mod').items():
                dbitem = DoubanItem()
                dbitem['title'] = item('.title a').text()
                dbitem['index_url'] = response.url
                logging.info(item('.title a').text())
                dbitem['url'] = item('.title a').attr('href')
                dbitem['times'] = item('.time span').text()
                yield dbitem
    
    

    有几个坑:

    1. restrict_xpaths = ('//*[@id="content"]/div/div[1]/div[25]/a')可以提取url,但是遇到很多页中间有省略项比如1 2...9 10,他就只能提取1,2,9,10,想来也是3-8都没有显示出来怎么提取呢,这时候用allow网址提取就好了,网址https://www.douban.com/doulist/37669191/?start=25&sort=time&playable=0&sub_type=,相似性是‘start=’前面的问号需转译。
      2.rules需iterable,这次rules只有一项所以要在后面加逗号。
      3.restrict_xpaths用浏览器提取

    相关文章

      网友评论

          本文标题:爬豆瓣豆列

          本文链接:https://www.haomeiwen.com/subject/llewnftx.html