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中list常用操作实例详解
Jun 03 Python
python实现井字棋游戏
Mar 30 Python
python利用不到一百行代码实现一个小siri
Mar 02 Python
django使用html模板减少代码代码解析
Dec 12 Python
Python向MySQL批量插数据的实例讲解
Mar 31 Python
解决nohup重定向python输出到文件不成功的问题
May 11 Python
Django基础知识 web框架的本质详解
Jul 18 Python
pytorch 更改预训练模型网络结构的方法
Aug 19 Python
简单了解Python读取大文件代码实例
Dec 18 Python
给ubuntu18安装python3.7的详细教程
Jun 08 Python
python 浮点数四舍五入需要注意的地方
Aug 18 Python
Python Map 函数的使用
Aug 28 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
dede3.1分页文字采集过滤规则详说(图文教程)续二
2007/04/03 PHP
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
php结合mysql与mysqli扩展处理事务的方法
2016/06/29 PHP
js验证表单第二部分
2006/11/25 Javascript
Fixie.js 自动填充内容的插件
2012/06/28 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
2015/04/07 Javascript
jQuery 判断图片是否加载完成方法汇总
2015/08/10 Javascript
基于gulp合并压缩Seajs模块的方式说明
2016/06/14 Javascript
jQuery实现可编辑表格并生成json结果(实例代码)
2017/07/19 jQuery
JS实现关键词高亮显示正则匹配
2018/06/22 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
详解Vue、element-ui、axios实现省市区三级联动
2019/05/07 Javascript
vue+koa2实现session、token登陆状态验证的示例
2019/08/30 Javascript
vue点击按钮动态创建与删除组件功能
2019/12/29 Javascript
简单了解JS打开url的方法
2020/02/21 Javascript
JavaScript实现点击切换验证码及校验
2021/01/10 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
2021/03/01 Vue.js
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
Linux下使用python调用top命令获得CPU利用率
2015/03/10 Python
PYTHON压平嵌套列表的简单实现
2016/06/08 Python
Golang与python线程详解及简单实例
2017/04/27 Python
python使用代理ip访问网站的实例
2018/05/07 Python
Python Pandas 获取列匹配特定值的行的索引问题
2019/07/01 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
Html5移动端div固定到底部实现底部导航条的几种方式
2021/03/09 HTML / CSS
巴西男士胡须和头发护理产品商店:Beard
2017/11/13 全球购物
美国家居装饰店:Pier 1
2019/09/04 全球购物
社会保险接收函
2014/01/12 职场文书
《再别康桥》教学反思
2014/02/12 职场文书
金融系应届毕业生求职信
2014/05/26 职场文书
公司承诺书格式范文
2015/04/28 职场文书
《吸血鬼:避世 血猎》官宣4.27发售 系列首款大逃杀
2022/04/03 其他游戏
python index() 与 rindex() 方法的使用示例详解
2022/12/24 Python