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 3.x 新特性及10大变化
Jun 12 Python
Python上传package到Pypi(代码简单)
Feb 06 Python
widows下安装pycurl并利用pycurl请求https地址的方法
Oct 15 Python
PyQt5响应回车事件的方法
Jun 25 Python
对python中的float除法和整除法的实例详解
Jul 20 Python
django 中使用DateTime常用的时间查询方式
Dec 03 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
Feb 26 Python
Python如何转换字符串大小写
Jun 04 Python
Python return语句如何实现结果返回调用
Oct 15 Python
Python模拟登录requests.Session应用详解
Nov 17 Python
Django显示可视化图表的实践
May 10 Python
python对文档中元素删除,替换操作
Apr 02 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生成局部唯一识别码LUID的代码
2012/10/06 PHP
php设计模式之中介者模式分析【星际争霸游戏案例】
2020/03/23 PHP
form中限制文本字节数js代码
2007/06/10 Javascript
javaScript 关闭浏览器 (不弹出提示框)
2010/01/31 Javascript
JS简单的图片放大缩小的两种方法
2013/11/11 Javascript
关于jquery中全局函数each使用介绍
2013/12/10 Javascript
使用jQuery动态加载js脚本文件的方法
2014/04/03 Javascript
jQuery toggleClass应用实例(附效果图)
2014/04/06 Javascript
JavaScript汉诺塔问题解决方法
2015/04/21 Javascript
JavaScript精炼之构造函数 Constructor及Constructor属性详解
2015/11/05 Javascript
学习javascript面向对象 掌握创建对象的9种方式
2016/01/04 Javascript
ES6中如何使用Set和WeakSet
2016/03/10 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
canvas绘制七巧板
2017/02/03 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
2017/05/13 jQuery
详解AngularJS用Interceptors来统一处理HTTP请求和响应
2017/06/08 Javascript
微信小程序 获取二维码实例详解
2017/06/23 Javascript
Vue resource中的GET与POST请求的实例代码
2017/07/21 Javascript
vue+element-ui动态生成多级表头的方法
2018/08/28 Javascript
Vue初始化中的选项合并之initInternalComponent详解
2020/06/11 Javascript
vue实现分页的三种效果
2020/06/23 Javascript
vue created钩子函数与mounted钩子函数的用法区别
2020/11/05 Javascript
利用Pandas 创建空的DataFrame方法
2018/04/08 Python
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
基于Python3.6+splinter实现自动抢火车票
2018/09/25 Python
python 判断三个数字中的最大值实例代码
2019/07/24 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
FC-Moto丹麦:欧洲最大的摩托车服装和头盔商店之一
2019/08/20 全球购物
英国最大的独立玩具专卖店:The Entertainer
2019/09/06 全球购物
某公司的.net工程师面试题笔试题
2013/11/22 面试题
酒店门卫岗位职责
2013/12/29 职场文书
副科竞争上岗演讲稿
2014/05/12 职场文书
2014市府办领导班子“四风问题”对照检查材料思想汇报
2014/09/24 职场文书
云冈石窟导游词
2015/02/04 职场文书
海上钢琴师的观后感
2015/06/11 职场文书
CSS3 实现的图片悬停的切换按钮
2021/04/13 HTML / CSS