Python爬虫作业python爬虫日记本

2017/4/20 scrapy response

2017-04-20  本文已影响131人  Carpe

作业代码

spider.py

# -*- coding: utf-8 -*-
import scrapy
from jianshu.items import JianshuItem
import sys
import re
import requests
import json
class WeekSpider(scrapy.Spider):
    name = "weekhot"

    def start_requests(self):
        for i in range(1, 6):
            self.url = 'http://www.jianshu.com/trending/weekly?&page=%s' % i
            yield scrapy.Request(self.url, self.get_url)

    def get_url(self, response):
        base_url = 'http://www.jianshu.com'
        total_url = response.xpath('//a[@class="title"]').extract()
        for i in total_url:
            link = b = re.findall('href="(.*?)">', i, re.S)[0]
            url = base_url + link
            yield scrapy.Request(url,callback=self.parse)


    def parse(self, response):
        #total = response.xpath('//div[@class="content"]')
        #item = []
        item = JianshuItem()
        item['author'] = response.xpath('//span[@class="name"]/a/text()').extract()
        item['post_date'] = response.xpath('//span[@class="publish-time"]/text()').extract()
        item['wordage'] = response.xpath('//span[@class="wordage"]/text()').extract()
        item['title'] = response.xpath('//div[@class="article"]/h1/text()').extract()
        item['read_num'] = re.search('views_count":(.*?),', response.text, re.S).group()
        item['comment_num'] = re.search('comments_count":(.*?),', response.text, re.S).group()
        item['like_num'] = re.search('likes_count":(.*?),', response.text, re.S).group()

        # 获取专题信息
        id = re.findall('{"id":(.*?),', response.text, re.S)[0]
        url = 'http://www.jianshu.com/notes/%s/included_collections?page=1' % id
        datas = []
        result = requests.get(url)
        data = json.loads(result.text)
        for one in data['collections']:
            datas.append(one['title'])
        count = data['total_pages']
        for one in range(2, count + 1):
            url = 'http://www.jianshu.com/notes/{}/included_collections?page={}'.format(id, one)
            result = requests.get(url)
            data = json.loads(result.text)
            for one in data['collections']:
                datas.append(one['title'])
        try:
            item['zhuanti'] = " ".join(datas).encode('utf-8')
        except:
            item['sp_title'] = u''
        yield item

item.py

import scrapy
class JianshuItem(scrapy.Item):
    # define the fields for your item here like:
    author = scrapy.Field()
    post_date = scrapy.Field()
    title = scrapy.Field()
    read_num = scrapy.Field()
    comment_num = scrapy.Field()
    like_num = scrapy.Field()

作业结果

作业结果

作业思路梳理

越来越觉得,思路这东西,如果没有足够清楚的思路以及保持这个思路前进与经过思考的修正,花再多的时间都是白费。
在作业中,困扰我的主要是start_url, start_resquest(), 这两个的区别,本来是虽然不能区分,但是也理得清楚,后面越做就越理不清了,陷入死循环了
对于这两点,因为时间的关系,没有查询,从刚才的调试中来谈下吧,从字面的意思上看,start_url是开始抓取的入口中,start_request()是一个函数,开始处理信息的入口,结合昨天的作业来看,这两个分别适应的情景,如果是一级页面,用start_url便可以了,而如果是有多层页面,start_request()来定义抓取的url,然后再写一个函数来爬取下一层的页面。
还有一个问题没有解决,就是提取被收录的专题,这个因为时间的原因,没有理解清楚。

在作业中发现的不足

  1. 总是有这样一个坏习惯,在做的过程中,如果遇到不懂的,第一选择往往是去谷歌,主要谷歌的对象是别人的经验,看下别人有没有类似的项目,然后快速扫一遍,看似能够比较快地解决问题,但是却是很零碎地知识,不系统,前期还好,但是在后面,可以预见地是懒于思考,会在一个个的问题上困扰更久。
  2. 没有很好地建立自己的知识索引系统,有一些问题,之前也是遇到过了,但是找起来还是不够快,这是物理上的索引,在大脑里的索引就是没有很好地总结归类。
上一篇下一篇

猜你喜欢

热点阅读