您的位置:首页 > 编程语言 > Python开发

爬虫第五战 scrapy小说爬取

2016-12-18 21:46 417 查看

终于发了起点小说爬取的姊妹篇,scrapy小说爬取,到现在这种方式还不是十分理解,但还是试了,也试出了一些成果,那么,现在进入正题

Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。(好吧,这是我抄的),操作过程大概是要先建立一个项目,就像这样,在命令提示符中进入到所需要的文件夹中,键入scrapy startproject +你想要将项目命名的名字然后就会在目的文件夹中发现打开后会发现是这样的结构
tutorial/
scrapy.cfg
tutorial/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
...
结构及其对应功能(摘自scrapy官方文本)
scrapy.cfg
: 项目的配置文件
tutorial/
: 该项目的python模块。之后您将在此加入代码。
tutorial/items.py
: 项目中的item文件.
tutorial/pipelines.py
: 项目中的pipelines文件.
tutorial/settings.py
: 项目的设置文件.
tutorial/spiders/
: 放置spider代码的目录.接下来说一下各部分的功能,有关功能介绍同样来自官方文本,代码则是我的有关起点小说的代码,item部分Item 是保存爬取到的数据的容器;其使用方法和python字典类似,并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。代码如下#coding:utf-8import scrapyclass AllbookItem(scrapy.Item):bookname = scrapy.Field()booklink = scrapy.Field()zhangjiename = scrapy.Field()zhangjielink = scrapy.Field()text = scrapy.Field()pass在该部分定义了需要爬去的几个爬取项(书名,对应书的链接,书的章节内容,书的章节链接,书的章节内容)spider部分Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容,提取生成item的方法。import scrapyfrom allbook.items import AllbookItemfrom scrapy.http import Requestfrom scrapy.selector import Selectorfrom scrapy.spiders import CrawlSpiderfrom bs4 import BeautifulSoupimport reimport sysimport requestsclass AllbookSpider(scrapy.Spider):name = 'allbook'for i in range(1,5):start_urls = ['http://f.qidian.com/all?size=-1&sign=-1&tag=-1&chanId=-1&subCateId=-1&orderId=&update=-1&page=%d&month=-1&style=1&action=-1' % i] # 获得网址def parse(self, response):for sel in response.xpath('//div[@class="book-mid-info"]/h4'):url = sel.xpath('a/@href').extract() # 获取每个小说链接content = sel.xpath('h4/a/text()').extract() # 获取对应小说名字item = AllbookItem()for i in range(len(url)):booklink = 'http://'+url[i]+'#Catalog' # 将每一个链接修改并在下一步中存入item['booklink'] = booklinkyield Request(booklink, callback=self.paserContent0, meta= {'item': item }, dont_filter=True) #将请求导入下一个函数def paserContent0(self,response):selector = Selector(response)soup = BeautifulSoup(selector.extract(), 'html.parser')item = response.meta['item'] # 导入itembookname = selector.xpath('//h1/em/text()').extract() #获得小说名存入itemitem['bookname'] = booknamefor sel1 in selector.xpath('//ul[@class="cf"]'):url1 = sel1.xpath('li/a/@href').extract() #获取章节链接content1 = sel1.xpath('/li/a/text()').extract()for a in range(len(url1)):html1 = 'http://'+url1[a]item['zhangjielink'] = html1yield Request(html1, callback=self.paserContent, meta={'item': item}, dont_filter=True)def paserContent(self,response):selector1 = Selector(response)item = response.meta['item']soup = BeautifulSoup(selector1.extract(),'html.parser')zhangjiename = soup.find('h3',class_ ="j_chapterName").get_text()item['zhangjiename'] = zhangjienametext = soup.find('div', class_ = "read-content j_readContent").get_text() # 获取正文item['text'] = textyield item有关代码部分的问题请看代码段注释
name:用于区别Spider。该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。
start_urls:包含了Spider在启动时进行爬取的url列表。因此,第一个被获取到的页面将是其中之一。后续的URL则从初始的URL获取到的数据中提取。parse()是spider的一个方法。被调用时,每个初始URL完成下载后生成的
Response
对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据(responsedata),提取数据(生成item)以及生成需要进一步处理的URL的
Request
对象。settings部分BOT_NAME = 'allbook'SPIDER_MODULES = ['allbook.spiders']NEWSPIDER_MODULE = 'allbook.spiders'FEED_URI = u'file:///D://PyCharm 2016.2.3//text//scrapy//tutorial//allbook//allbook.csv' # 存储路径FEED_FORMAT = 'CSV' #定义想要存储的格式user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:49.0) Gecko/20100101 Firefox/49.0'ROBOTSTXT_OBEY = Truepipeline部分当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。以下是item pipeline的一些典型应用:清理HTML数据验证爬取的数据(检查item包含某些字段)查重(并丢弃)将爬取结果保存到数据库中由于将文件存储在本地,pipeline部分没有较大更改import jsonimport codecsclass AllbookPipeline(object):def __int__(self):self.file = codecs.open('item.json', 'w+', encoding='utf-8')def process_item(self, item, spider):line = json.dumps(dict(item), ensure_ascii=False) + '\n'self.file.write(str.decode("unicode_escape"))return itemmain部分运行文件,不必每次都在命令提示符里输入执行指令,与items.py在同一存储位置from scrapy import cmdlinecmdline.execute("scrapy crawl allbook".split())这是我有关第二部分小说爬取scrapy的全部内容,如果有错误,麻烦留言博主改正,欢迎各位大牛批评指教,THANKS
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python scrapy