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 相关文章推荐
Django1.3添加app提示模块不存在的解决方法
Aug 26 Python
详谈Numpy中数组重塑、合并与拆分方法
Apr 17 Python
python贪婪匹配以及多行匹配的实例讲解
Apr 19 Python
django 发送手机验证码的示例代码
Apr 25 Python
python获取文件真实链接的方法,针对于302返回码
May 14 Python
PyQt5实现简易计算器
May 30 Python
python Django的web开发实例(入门)
Jul 31 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
Feb 18 Python
django model object序列化实例
Mar 13 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 Python
使用Python画了一棵圣诞树的实例代码
Nov 27 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 24 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
初学者入门:细述PHP4的核心Zend
2006/09/05 PHP
PHP常用函数和常见疑难问题解答
2014/03/05 PHP
PHP7.1方括号数组符号多值复制及指定键值赋值用法分析
2016/09/26 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
JS解密入门 最终变量劫持
2008/06/25 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
设置jsf的选择框h:selectOneMenu为不可编辑状态的方法
2014/01/07 Javascript
jQuery多项选项卡的实现思路附样式及代码
2014/06/03 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
Angularjs 基础入门
2014/12/26 Javascript
JavaScript实现将xml转换成html table表格的方法
2015/04/17 Javascript
JavaScript中的this,call,apply使用及区别详解
2016/01/29 Javascript
JS中判断字符串中出现次数最多的字符及出现的次数的简单实例
2016/06/03 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
JS实现一次性弹窗的方法【刷新后不弹出】
2016/12/26 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
2017/04/28 Javascript
javaScript手机号码校验工具类PhoneUtils详解
2017/12/08 Javascript
Openlayers显示瓦片网格信息的方法
2020/09/28 Javascript
Vue 401配合Vuex防止多次弹框的案例
2020/11/11 Javascript
JavaScript/TypeScript 实现并发请求控制的示例代码
2021/01/18 Javascript
centos6.4下python3.6.1安装教程
2017/07/21 Python
python在每个字符后添加空格的实例
2018/05/07 Python
Python实现多线程的两种方式分析
2018/08/29 Python
python调用百度语音识别api
2018/08/30 Python
python统计指定目录内文件的代码行数
2019/09/19 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
使用Python将Exception异常错误堆栈信息写入日志文件
2020/04/08 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
HTML5表单验证特性(知识点小结)
2020/03/10 HTML / CSS
Python的两道面试题
2013/06/29 面试题
单位承诺书格式
2014/05/21 职场文书
无房产证房屋转让协议书合同样本
2014/10/18 职场文书
2015年安全工作总结范文
2015/04/02 职场文书
2015年教师教学工作总结
2015/04/28 职场文书