美文网首页爬虫,数据分析那些事
Scrapy抓取小说网站存储成json

Scrapy抓取小说网站存储成json

作者: whong736 | 来源:发表于2018-12-07 18:16 被阅读10次

抓取 的目标网站是小说网站:笔趣看 小说名为 元尊
http://biqukan.com/0_790/

image.png

思路;先抓取每个章节的链接,然后在通过链接抓取小说的内容 抓取的链接的页面:。

1.新建项目:

scrapy startproject biqukanproject

2.cd进入项目文件biqukanproject, 以basic模板新建爬虫

cd biqukanproject
scrapy genspider -t basic biqukanspider biqukan.com
image.png

3 .明确需要抓的字段:小说名 、章节名称、章节链接、章节的内容。编写item

# -*- coding: utf-8 -*-
import scrapy

class BiqukanprojectItem(scrapy.Item):
   url = scrapy.Field()
   title_novel = scrapy.Field()
   title_chapter = scrapy.Field()
   content = scrapy.Field()

编写item

4.编写Spider爬虫文件

先分析一下页面结构,使用Xpath helper ,输入xpath表达式来定位元素


image.png

循环抓取章节信息以及章节链接,进入章节内抓取内容

# -*- coding: utf-8 -*-
import scrapy
from scrapy.selector import Selector
from biqukanproject.items import BiqukanprojectItem

class BiqukanspiderSpider(scrapy.Spider):
    name = 'biqukanspider' # 爬虫的名称
    allowed_domains = ['biqukan.com'] # 允许的域名
    start_urls = ['http://biqukan.com/0_790/']
    # 开始爬取的链接
    def parse(self, response):
    # 链接爬取的方法
        selector = Selector(response)
        # 创建一个选择器的实例
        listmain = selector.xpath('.//div[@class="listmain"]/dl/dd')[60:64]

        for dd in listmain:
            title_novel = selector.xpath('.//h2/text()').extract_first()
            item = BiqukanprojectItem(title_novel=title_novel)
            partial_url = dd.xpath('.//a/@href').extract_first()
            url = response.urljoin(partial_url)
            title_chapter = dd.xpath('.//a/text()').extract_first()
            item['url'] = url
            item['title_chapter'] =title_chapter
            request = scrapy.Request(url=url,callback=self.parse_body)

            # 从这里可以看出,scrapy.Request返回值是它回调函数的返回值

            # Request中有一个参数是meta
            # 作用是将一个信息(任意的类型)传递给callback回调函数
            # 当然传递使用字典的形式进行的,
            # meta={'key':item}  (下面的request.meta【‘item’】可以这么写)

            # 这里为了将详情页的内容和主页的内容一起存储,用了meta方法对,主页的内容
            # 进行了一个暂存,在后面进行统一的提交
            request.meta['item'] = item # 将item暂存一下
            yield request

    def parse_body(self,response):
    # 爬取详情页的方法
        item = response.meta['item']
        # 这是在回调函数中调用刚传进来的信息
        # 当然用的是字典的形式调用信息的呀
        # 这是回调函数中有一个response的meta属性可以调用传过来的信息
        content_list = response.xpath('.//div[@id="content"]/text()').extract()
        content = '\n\n'.join(content_list)
        # 提取详情页的内容
        item['content'] = content
        print( item['content'])
        yield item
        # yield是将这个函数包装成一个迭代器,每次调用都返回这个item

编写spider

5.编写Pipeline文件,存储成json

class BiqukanprojectPipeline(object):
    def __init__(self):
        self.file = open('novel.json',"wb")
    def process_item(self, item, spider):
        self.file.write(bytes(str(item),encoding='utf-8'))
        return item
image.png

6.设置setting

USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36'

ITEM_PIPELINES = {
   'biqukanproject.pipelines.BiqukanprojectPipeline': 300,
}
修改请求头

7.运行爬虫文件

scrapy crawl biqukanspider   --nolog

image.png

8.查看json文件

image.png

9 源码地址

github https://github.com/wzw5566/biqukanproject


觉得文章有用,请用支付宝扫描,领取一下红包!打赏一下

支付宝红包码

相关文章

网友评论

    本文标题:Scrapy抓取小说网站存储成json

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