python scrapy爬虫代码及填坑


Posted in Python onAugust 12, 2019

涉及到详情页爬取

目录结构:

python scrapy爬虫代码及填坑

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=r'https://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

xmly.py

# -*- coding: utf-8 -*-
import scrapy
from ..items import BookXMLYItem, BookChapterItem
class XmlySpider(scrapy.Spider):
 name = 'xmly'
 allowed_domains = ['ximalaya.com']
 start_urls = ['https://www.ximalaya.com/youshengshu/wenxue/']

 def parse(self, response):
  div_details = response.xpath('//*[@id="root"]/main/section/div/div/div[3]/div[1]/div/div[2]/ul/li/div')
  # details = div_details[::3]
  for details in div_details:
   book_id = details.xpath('./div/a/@href').get().split('/')[-2]
   book_name = details.xpath('./a[1]/@title').get()
   book_author = details.xpath('./a[2]/text()').get() # 作者
   book_url = details.xpath('./div/a/@href').get()
   url = 'https://www.ximalaya.com' + book_url
   # print(book_id, book_name, book_author, url)
   item = BookXMLYItem(book_id=book_id, book_name=book_name, book_author=book_author, book_url=url)
   yield item
   yield scrapy.Request(url=url, callback=self.parse_details, meta={'info': book_id})

 def parse_details(self, response):
  book_id = response.meta.get('info')
  div_details = response.xpath('//*[@id="anchor_sound_list"]/div[2]/ul/li/div[2]')
  for details in div_details:
   chapter_id = details.xpath('./a/@href').get().split('/')[-1]
   chapter_name = details.xpath('./a/text()').get()
   chapter_url = details.xpath('./a/@href').get()
   url = 'https://www.ximalaya.com' + chapter_url
   item = BookChapterItem(book_id=book_id, chapter_id=chapter_id, chapter_name=chapter_name, chapter_url=url)
   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
import os
class BqgPipeline(object):
 def process_item(self, item, spider):
  xs = '小说集'
  name = item['name']
  xs_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), xs)
  fiction_path = os.path.join(xs_path, name)
  # print(os.path.dirname(__file__)) D:/Users/Administrator/PycharmProjects/wh1901/biquge.com
  # print(os.path.dirname(os.path.dirname(__file__))) D:/Users/Administrator/PycharmProjects/wh1901
  if not os.path.exists(xs_path): # 如果目录不存在
   os.mkdir(xs_path)
  if not os.path.exists(fiction_path):
   os.mkdir(fiction_path) # 创建目录
  chapter = item['chapter']
  content = item['content']
  file_path = os.path.join(fiction_path, chapter) + '.txt' # 在 该目录下面创建 xx .txt 文件
  with open(file_path, 'w', encoding='utf-8') as fp:
   fp.write(content + '\n')
   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())

然后是爬取到的数据

小说

python scrapy爬虫代码及填坑

xmly.json

python scrapy爬虫代码及填坑

记录一下爬取过程中遇到的一点点问题:

在爬取详情页的的时候, 刚开始不知道怎么获取详情页的 url 以及 上一个页面拿到的字段

python scrapy爬虫代码及填坑

  • 也就是 yield 返回 请求详情页 里面的参数没有很好地理解
  • meta:从其他请求传过来的meta属性,可以用来保持多个请求之间的数据连接。
  • url:这个request对象发送请求的url。
  • callback:在下载器下载完相应的数据后执行的回调函数。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python中使用HTMLParser解析HTML的教程
Apr 29 Python
Python实现发送QQ邮件的封装
Jul 14 Python
Python语言描述机器学习之Logistic回归算法
Dec 21 Python
python常用函数与用法示例
Jul 02 Python
代码实例讲解python3的编码问题
Jul 08 Python
使用python socket分发大文件的实现方法
Jul 08 Python
python tkinter实现彩球碰撞屏保
Jul 30 Python
Python之Numpy的超实用基础详细教程
Oct 23 Python
对tensorflow中的strides参数使用详解
Jan 04 Python
pycharm不能运行.py文件的解决方法
Feb 12 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
Apr 29 Python
python实现扫雷游戏的示例
Oct 20 Python
Python 中的 global 标识对变量作用域的影响
Aug 12 #Python
Python中pymysql 模块的使用详解
Aug 12 #Python
python中类的输出或类的实例输出为这种形式的原因
Aug 12 #Python
对Django 中request.get和request.post的区别详解
Aug 12 #Python
python文字和unicode/ascll相互转换函数及简单加密解密实现代码
Aug 12 #Python
Python简易版停车管理系统
Aug 12 #Python
Python代码实现http/https代理服务器的脚本
Aug 12 #Python
You might like
php下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
php面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
php与mysql建立连接并执行SQL语句的代码
2011/07/04 PHP
解决cPanel无法安装php5.2.17
2014/06/22 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
基于jQuery实现下拉收缩(展开与折叠)特效
2012/12/25 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
jQuery将所有被选中的checkbox某个属性值连接成字符串的方法
2015/01/24 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(上)
2015/10/28 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
react-native 完整实现登录功能的示例代码
2017/09/11 Javascript
bootstrap table实现点击翻页功能 可记录上下页选中的行
2017/09/28 Javascript
JavaScript实现短信倒计时60s
2017/10/09 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
JS实现数组删除指定元素功能示例
2019/06/05 Javascript
Vue 2.0 侦听器 watch属性代码详解
2019/06/19 Javascript
Javascript作用域和作用域链原理解析
2020/03/03 Javascript
easyUI 实现的后台分页与前台显示功能示例
2020/06/01 Javascript
python进程类subprocess的一些操作方法例子
2014/11/22 Python
Python自定义简单图轴简单实例
2018/01/08 Python
python实现百万答题自动百度搜索答案
2018/01/16 Python
Python字符串格式化%s%d%f详解
2018/02/02 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
Python3随机漫步生成数据并绘制
2018/08/27 Python
Python math库 ln(x)运算的实现及原理
2019/07/17 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
2020/04/24 Python
分享一个python的aes加密代码
2020/12/22 Python
html5利用canvas实现颜色容差抠图功能
2019/12/23 HTML / CSS
JPA的特点
2014/10/25 面试题
学习党章思想汇报
2014/01/07 职场文书
国企干部对照检查材料
2014/08/22 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
2015年村计划生育工作总结
2015/04/28 职场文书
《绝招》教学反思
2016/02/20 职场文书
如何利用Python实现一个论文降重工具
2021/07/09 Python