Scrapy爬取小说简单逻辑

一 准备工作

1)安装Python

2)安装PIP
3)安装scrapy
4)安装pywin32
5)安装VCForPython27.exe

...........

具体安装步骤,可参考http://www.cnblogs.com/zyj-python/p/7392476.html

二 爬虫逻辑

1.CMD终端创建爬虫项目
cd Desktop(返回桌面目录) #选择文件保存位置,我放在了桌面

Scrapy startProject BooksSpider  #BooksSpider为项目名称,自己起名

    (ps:CMD终端显示"rou can start your first spider with:"表示项目创建成功)
 
2.创建爬虫文件
拖动爬虫项目文件用Pycharm打开,点击左下角Terminal打开终端
scrapy genspider books(蜘蛛名,自定义,不能重复,可以修改但不建议修改) www.qisuu.com(网站域名, 这里以奇书网为例)
3.双击打开爬虫文件(蜘蛛文件.py),在Spiders包中引用可能用到的包
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import scrapy
import urlparse
from ..items import BooksItem
(ps:文件夹图标中带空心圆为包,只有包才能直接引入,带__init__.py的文件,
没有则表示文件夹)
以下是创建爬虫文件自带:
class BooksSpider(scrapy.Spider):
name = 'books'
allowed_domains = ['www.qisuu.com']
start_urls = ['http://www.qisuu.com/'] def parse(self, response):
  pass
4.明确爬取目标
以奇书网为例:
1)请求导航条上每个按钮对应页面
2)分别解析每个页面的电子书列表(主要获得电子书详情URL)
3)请求详情URL,解析电子书的详细信息(书名,封面,评分,大小....下载地址)
4)根据下载地址下载电子书到本地
制作爬虫:
  在books.py中
# -*- coding: utf- -*-
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import scrapy
import urlparse
from ..items import BooksItem class BooksSpider(scrapy.Spider):
name = 'books'
allowed_domains = ['www.qisuu.com']
start_urls = ['http://www.qisuu.com/']    #获取首页导航条的url
def parse(self, response): a_list=response.xpath("//div[@class='nav']/a[@target='_blank']")
for a in a_list:
#分类名称
category_namme=a.xpath("text()").extract_first("")
#拼接完整的分类url
category_url=urlparse.urljoin(response.url,a.xpath("@href").extract_first(""))        #yield将结果返回调度器
#将分类地址转发给downloader下载并将结果传给parse_books_list
#meta:专门用来传递参数,类型是字典
yield scrapy.Request(
url=category_url,
callback=self.parse_books_list,
meta={"category_namme":category_namme,}
)
        #获取分类页面的所有url
def parse_books_list(self,response):
href_list=response.xpath("//div[@class='listBox']/ul/li/a/@href").extract()
for href in href_list:
list_href=urlparse.urljoin(response.url,href)
yield scrapy.Request(
url=list_href,
callback=self.parse_books_detail,
meta=response.meta,
# meta={"category_namme": response.meta['category_namme'],}
)
      #获取所有页数,并循环获得每一页的url
all_pages=response.xpath("//select[@name='select']/option/@value").extract()
for page in all_pages:
detail_url=urlparse.urljoin(response.url,page)
yield scrapy.Request(
url=detail_url,
callback=self.parse_books_list,
meta=response.meta
)
        #获取每个小说的详情
def parse_books_detail(self,response):
info_div=response.xpath("//div[@class='detail_right']")
title=info_div.xpath("h1/text()").extract_first("")
li_list=info_div.xpath("ul/li")
size=li_list[].xpath("text()").extract_first("")
size=size.replace(u"文件大小:","").strip()
date_time=li_list[].xpath("text()").extract_first("")
date_time=date_time.replace(u"发布日期:","").strip()
user=li_list[].xpath("a/text()").extract_first("")
download_times=li_list[].xpath("text()").extract_first("")
download_times = download_times.replace(u"下载次数:", "").strip()
book_degree=li_list[].xpath("em/@class").extract_first("")
book_degree = book_degree.replace("lstar","").strip()
download_url=response.xpath("//a[@class='downButton']/@href")[].extract()
img_url=response.xpath("//div[@class='detail_pic']/img/@src").extract_first("")
img_url=urlparse.urljoin(response.url,img_url)
category_namme=response.meta['category_namme']
print title,user,date_time,category_namme item=BooksItem()
item['title']=title
item['size']=size
item['date_time']=date_time
item['user']=user
item['download_times']=download_times
item['book_degree']=book_degree
item['download_url'] = [u"%s"%download_url] #当下在路径有乱码,加u 小说要以GBK格式存储,有中文时要进行编码
item['img_url']=[img_url]
item['category_namme']=category_namme
yield item
    #yield 将结果返回给items.py文件

  代码中的xpath与正则表达式是一样的,只是用法更加简单方便, 具体操作可百度, 此处不细说.

  在items.py文件中

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html import scrapy class BooksspiderItem(scrapy.Item):
# define the fields for your item here like:
# name = scrapy.Field()
# pass
class BooksItem(scrapy.Item):
title = scrapy.Field()
size = scrapy.Field()
date_time = scrapy.Field()
user = scrapy.Field()
download_times = scrapy.Field()
book_degree = scrapy.Field()
download_url = scrapy.Field()
img_url = scrapy.Field()
category_namme = scrapy.Field() #自定义一个类,用来接收获取到的数据
#Field()可以接受任何类型的参数

这时就可以开始爬虫了, 代码为:

scrapy crawl books -o book.json -s FEED_EXPORT_ENCODING = utf-8

  其中 scrapy crawl books 是运行books爬虫程序, -o book.json 为以json格式保存, FEED_EXPORT_ENCODING = utf-8 为编码格式

友情提示: 不要轻易去爬虫,只有确定自己代码没有问题才可以,可以先使用终端测试(cmd),将代码一行一行依次粘贴运行

scrapy shell http://www.qisuu.com
  (ps:利用CMD终端测试,不要轻易去爬虫,成功末尾显示IN[1],然后依次在终端复制粘贴进去
  相关代码,包括相关引入import代码,利用xpath取特定数据可在终端打印查看效果,有时要回
  车两次展示,在目标网站没有反爬虫协议或所需数据极少时可考虑在Terminal直接运行)

如果想要下载至本地:

需要修改settings.py文件

ITEM_PIPELINES = {
# 'BooksSpider.pipelines.BooksspiderPipeline': 300,
"scrapy.pipelines.images.ImagesPipeline":1,
"scrapy.pipelines.files.FilesPipeline":2,
}
IMAGES_URLS_FIELD = "img_url"
IMAGES_STORE = "imgs"
FILES_URLS_FIELD = "download_url"
FILES_STORE = "files"

  找到ITEM_PIPELINES,大约在67行,做出如上修改,IMAGES_URLS_FIELD获取下载图片的url, IMAGES_STORE新建一个文件夹,用来存放图片 FILES用法鱼IMAGES一致

可能存在的问题,原因及解决方案:

1.网站源代码结构与请求到的代码结构可能不一致
(如tbody只在浏览器渲染的结构中有而请求出来的没有)
解决方案:优化xpath写法,或改用正则表达式
2.请求robots.txt后显示200意为请求到反爬虫协议成功会自动停止爬虫程序
解决方案:设置不遵守robots.txt反爬虫协议,强行进入
3.在请求到某个url显示200成功后却突然自动停止爬虫(closing spider)
可能原因:若显示Filtered offsite request则意为scrapy自动过滤该url把它放入了黑名单
解决方案:在该url代码运行的函数meta字典中加入dont_filter = True默认
True不要过滤,若改为False则是要过滤
 
以上就是Scrapy爬虫的基本逻辑!
 
 

Scrapy爬取小说简单逻辑的更多相关文章

  1. scrapy爬取小说盗墓笔记

    # -*- coding: utf-8 -*- import scrapy from daomu.items import DaomuItem class DaomuspiderSpider(scra ...

  2. scrapy 爬取小说

    QiushuSpider # -*- coding: utf-8 -*- import scrapy import time from qiushu.items import QiushuItem c ...

  3. 小说免费看!python爬虫框架scrapy 爬取纵横网

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 风,又奈何 PS:如有需要Python学习资料的小伙伴可以加点击下方 ...

  4. Golang 简单爬虫实现,爬取小说

    为什么要使用Go写爬虫呢? 对于我而言,这仅仅是练习Golang的一种方式. 所以,我没有使用爬虫框架,虽然其很高效. 为什么我要写这篇文章? 将我在写爬虫时找到资料做一个总结,希望对于想使用Gola ...

  5. Scrapy爬取美女图片第三集 代理ip(上) (原创)

    首先说一声,让大家久等了.本来打算那天进行更新的,可是一细想,也只有我这样的单身狗还在做科研,大家可能没心思看更新的文章,所以就拖到了今天.不过忙了521,522这一天半,我把数据库也添加进来了,修复 ...

  6. 以豌豆荚为例,用 Scrapy 爬取分类多级页面

    本文转载自以下网站:以豌豆荚为例,用 Scrapy 爬取分类多级页面 https://www.makcyun.top/web_scraping_withpython17.html 需要学习的地方: 1 ...

  7. scrapy 爬取纵横网实战

    前言 闲来无事就要练练代码,不知道最近爬取什么网站好,就拿纵横网爬取我最喜欢的雪中悍刀行练手吧 准备 python3 scrapy 项目创建: cmd命令行切换到工作目录创建scrapy项目  两条命 ...

  8. scrapy爬取海量数据并保存在MongoDB和MySQL数据库中

    前言 一般我们都会将数据爬取下来保存在临时文件或者控制台直接输出,但对于超大规模数据的快速读写,高并发场景的访问,用数据库管理无疑是不二之选.首先简单描述一下MySQL和MongoDB的区别:MySQ ...

  9. Scrapy爬取美女图片 (原创)

    有半个月没有更新了,最近确实有点忙.先是华为的比赛,接着实验室又有项目,然后又学习了一些新的知识,所以没有更新文章.为了表达我的歉意,我给大家来一波福利... 今天咱们说的是爬虫框架.之前我使用pyt ...

随机推荐

  1. C语言递归之二叉树的最大深度

    题目描述 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例 给定二叉树 [3,9,20,null,null,15 ...

  2. freeRTOS学习8-21

    不能再中断服务程序调用该函数 应该调用xQueueSendFromISR()

  3. nRF5 SDK Bootloader and DFU moudles(2)

    镜像的验证 在执行设备固件更新之前,应验证新映像. 在传输实际固件(预验证)之前,可以检查某些信息(例如,兼容性). 其他信息,例如图像的散列,应在传输(验证后)后进行验证. Init packet ...

  4. kubespray 修改配置

    1.安装前的修改配置 # [root@slave1 kubespray]# vim inventory/local/group_vars/k8s-cluster.yml kube_network_pl ...

  5. STL set 常见用法详解

    <算法笔记>学习笔记 set 常见用法详解 set是一个内部自动有序且不含重复元素的容器 1. set 的定义 //单独定义一个set set<typename> name: ...

  6. Python 字符串,元祖,列表之间的转换

    1.字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 = 'Hello World!' 2. ...

  7. Springboot导出Excel并下载

    引入相关依赖 <!--数据导出excel--> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> & ...

  8. 代理、反射、注解、hook

    代理 通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,扩展目标对象的功能. 代理对象拦截真实对象的方法调用,在真实对象调用前/后实现自己的逻辑调用 这里使用到编程中的一个思想:不 ...

  9. Vasya and Magic Matrix CodeForces - 1042E (概率dp)

    大意:给定n*m矩阵, 初始位置(r,c), 每一步随机移动到权值小于当前点的位置, 得分为移动距离的平方, 求得分期望. 直接暴力dp的话复杂度是O(n^4), 把距离平方拆开化简一下, 可以O(n ...

  10. Hinton等人新研究:如何更好地测量神经网络表示相似性

    Hinton等人新研究:如何更好地测量神经网络表示相似性 2019年05月22日 08:39:15 喜欢打酱油的老鸟 阅读数 177更多 分类专栏: 人工智能   https://www.toutia ...