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中for循环详解
Jan 17 Python
Python实现类继承实例
Jul 04 Python
MySQLdb ImportError: libmysqlclient.so.18解决方法
Aug 21 Python
使用Python构建Hopfield网络的教程
Apr 14 Python
Python解决八皇后问题示例
Apr 22 Python
Python单元测试实例详解
May 25 Python
Python多重继承的方法解析执行顺序实例分析
May 26 Python
python 对dataframe下面的值进行大规模赋值方法
Jun 09 Python
查看python下OpenCV版本的方法
Aug 03 Python
python实现根据指定字符截取对应的行的内容方法
Oct 23 Python
python 检查数据中是否有缺失值,删除缺失值的方式
Dec 02 Python
JupyterNotebook设置Python环境的方法步骤
Dec 03 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
CentOS安装php v8js教程
2015/02/26 PHP
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
PHP中类型转换 ,常量,系统常量,魔术常量的详解
2017/10/26 PHP
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
2010/06/28 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
常见的jQuery选择器汇总
2014/11/24 Javascript
深入探讨javascript中的数据类型
2015/03/04 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
jQuery事件绑定用法详解
2016/09/08 Javascript
原生js实现倒计时--2018
2017/02/21 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
Js利用console计算代码运行时间的方法示例
2017/09/24 Javascript
javascript 作用于作用域链的详解
2017/09/27 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
小程序清理本地缓存的方法
2018/08/17 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
2020/04/26 Javascript
小程序选项卡以及swiper套用(跨页面)
2020/06/19 Javascript
vue实现轮播图帧率播放
2021/01/26 Vue.js
[02:57]2014DOTA2国际邀请赛-观众采访
2014/07/19 DOTA
Python 序列的方法总结
2016/10/18 Python
python算法与数据结构之单链表的实现代码
2019/06/27 Python
sklearn+python:线性回归案例
2020/02/24 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
2020/02/26 Python
python+OpenCV实现图像拼接
2020/03/05 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
2020/03/09 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
HTML5中的音频和视频媒体播放元素小结
2016/01/29 HTML / CSS
全球航班旅行搜索网站:Cheapflights
2017/05/19 全球购物
英语专业毕业生自我鉴定
2013/11/09 职场文书
《厄运打不垮的信念》教学反思
2014/04/13 职场文书
优秀驾驶员先进事迹材料
2014/05/04 职场文书
2015纪念九一八事变84周年演讲稿
2015/03/19 职场文书
2015年出纳个人工作总结
2015/04/02 职场文书
职工的安全责任书范文!
2019/07/02 职场文书
yyds什么意思?90后已经听不懂00后讲话了……
2022/02/03 杂记