首页 > 编程语言 > 详细

python_scrapy_爬虫

时间:2019-07-13 16:06:24      阅读:105      评论:0      收藏:0      [点我收藏+]

 python ,  scrapy框架入门 , xpath解析, json 存储. 

涉及到详情页爬取, 

 目录结构:

技术分享图片

 

 kaoshi_bqg.py

import scrapy
from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractor
from ..items import BookBQGItem


class KaoshiBqgSpider(scrapy.Spider):
    name = kaoshi_bqg
    allowed_domains = [biquge5200.cc]
    start_urls = [https://www.biquge5200.cc/xuanhuanxiaoshuo/]

    rules = (
        # 编写匹配文章列表的规则
        Rule(LinkExtractor(allow=rhttps://www.biquge5200.cc/xuanhuanxiaoshuo/), follow=True),
        # 匹配文章详情
        Rule(LinkExtractor(allow=r.+/[0-9]{1-3}_[0-9]{2-6}/), callback=parse_item, follow=False),
    )

    # 小书书名
    def parse(self, response):
        a_list = response.xpath(//*[@id="newscontent"]/div[1]/ul//li//span[1]/a)
        for li in a_list:
            name = li.xpath(".//text()").get()
            detail_url = li.xpath(".//@href").get()
            yield scrapy.Request(url=detail_url, callback=self.parse_book, meta={info: name})

    #  单本书所有的章节名
    def parse_book(self, response):
        name = response.meta.get(info)
        list_a = response.xpath(//*[@id="list"]/dl/dd[position()>20]//a)
        for li in list_a:
            chapter = li.xpath(".//text()").get()
            url = li.xpath(".//@href").get()
            yield scrapy.Request(url=url, callback=self.parse_content, meta={info: (name, chapter)})

    # 每章节内容
    def parse_content(self, response):
        name, chapter = response.meta.get(info)
        content = response.xpath(//*[@id="content"]//p/text()).getall()
        item = BookBQGItem(name=name, chapter=chapter, content=content)
        yield item

 

 

item.py

import scrapy


# 笔趣阁字段
class BookBQGItem(scrapy.Item):
    name = scrapy.Field()
    chapter = scrapy.Field()
    content = scrapy.Field()


# 喜马拉雅 字段
class BookXMLYItem(scrapy.Item):
    book_name = scrapy.Field()
    book_id = scrapy.Field()
    book_url = scrapy.Field()
    book_author = scrapy.Field()


# 喜马拉雅详情字段
class BookChapterItem(scrapy.Item):
    book_id = scrapy.Field()
    chapter_id = scrapy.Field()
    chapter_name = scrapy.Field()
    chapter_url = scrapy.Field()

 

 

pipelines.py

from scrapy.exporters import JsonLinesItemExporter


class BqgPipeline(object):
    def __init__(self):
        self.fp = open("biquge.json", wb)
        #  JsonLinesItemExporter 调度器
        self.exporter = JsonLinesItemExporter(self.fp, ensure_ascii=False)

    def process_item(self, item, spider):
        self.exporter.export_item(item)
        return item

    def close_item(self):
        self.fp.close()
        print("爬虫结束")


# class XmlyPipeline(object):
#     def __init__(self):
#         self.fp = open("xmly.json", ‘wb‘)
#         #  JsonLinesItemExporter 调度器
#         self.exporter = JsonLinesItemExporter(self.fp, ensure_ascii=False)
#
#     def process_item(self, item, spider):
#         self.exporter.export_item(item)
#         return item
#
#     def close_item(self):
#         self.fp.close()
#         print("爬虫结束")

starts.py

from scrapy import cmdline

cmdline.execute("scrapy crawl kaoshi_bqg".split())
# cmdline.execute("scrapy crawl xmly".split())

 

然后是爬取到的数据

 

biquge.json

技术分享图片

 

 

 xmly.json技术分享图片

  • 记录一下爬取过程中遇到的一点点问题:
    • 在爬取详情页的的时候, 刚开始不知道怎么获取详情页的 url 以及 上一个页面拿到的字段
    • 技术分享图片
       
    • 也就是 yield 返回 请求详情页 里面的参数没有很好地理解
      • meta:从其他请求传过来的meta属性,可以用来保持多个请求之间的数据连接。
      • url:这个request对象发送请求的url。
      • callback:在下载器下载完相应的数据后执行的回调函数。

python_scrapy_爬虫

原文:https://www.cnblogs.com/longpy/p/11180956.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!