简单的scrapy实例
前天实验室的学长要求写一个简单的scrapy工程出来,之前也多少看了点scrapy的知识,但始终没有太明白,刚好趁着这个机会,加深一下对scrapy工作流程的理解。由于临近期末,很多作业要做(其实。。。。。。。。。。。。。。主要还是自己太菜了,嘻嘻),所以决定去搜一个简单的实例模仿一下。
显示搜了一个爬取腾讯招聘网了例子(https://www.cnblogs.com/xinyangsdut/p/7628770.html),动手敲完之后无法运行,试着调式,也无法解决。就又去找了一个爬取博客园的(https://www.jianshu.com/p/78f0bc64feb8),这个例子只能爬取第一页,稍微改了下,可以爬取任意多个页面。再改的时候,也遇到了一下麻烦。还是对scrapy理解不够(其实。。。。。。。还是自己太菜,流下了无知的眼泪),不过最好总算是顺利完成了。下面,简单的解剖一下这个例子。
- 首先是编写item文件,根据爬取的内容,定义爬取字段。代码如下:
import scrapy class CnblogItem(scrapy.Item): 
 # define the fields for your item here like:
 # name = scrapy.Field()
 title = scrapy.Field() #定义爬取的标题
 link = scrapy.Field() #定义爬取的连接
- 编写spider文件(这是关键),这里命名为cnblog_spider,代码如下:
# -*- coding: utf-8 -*- 
 import scrapy
 from cnblog.items import CnblogItem class CnblogSpiderSpider(scrapy.Spider):
 name = "cnblog_spider"
 allowed_domains = ["cnblogs.com"]
 url = 'https://www.cnblogs.com/sitehome/p/'
 offset = 1
 start_urls = [url+str(offset)] def parse(self, response): item = CnblogItem() item['title'] = response.xpath('//a[@class="titlelnk"]/text()').extract() #使用xpath搜索
 item['link'] = response.xpath('//a[@class="titlelnk"]/@href').extract() yield item print("第{0}页爬取完成".format(self.offset))
 if self.offset < 10: #爬取到第几页
 self.offset += 1
 url2 = self.url+str(self.offset) #拼接url
 print(url2)
 yield scrapy.Request(url=url2, callback=self.parse)就这部分代码内容来说,没什么难于理解的,但如果搞明白整个运行流程的话,对理解scrapy有很大的帮助。 
- 编写pipelines文件,用于把我们爬取到的数据写入TXT文件。
class FilePipeline(object): 
 def process_item(self, item, spider): data = '' with open('cnblog.txt', 'a', encoding='utf-8') as f:
 titles = item['title']
 links = item['link']
 for i, j in zip(titles, links):
 data += i+' '+j+'\n' f.write(data)
 f.close()
 return item
- 更改setting文件
ROBOTSTXT_OBEY = False #一定要把这个参数的值更改为Fals DEFAULT_REQUEST_HEADERS = {
 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
 'Accept-Language': 'en',
 #user-agent新添加
 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"
 }
 #新修改
 ITEM_PIPELINES = {
 'cnblog.pipelines.FilePipeline': 300, #实现保存到txt文件 }
- 编写一个main文件,scrapy是不能在编译器里面调试的,但我们可以自己写一个主文件,运行这个主文件就可以像普通的工程一样在编译器里调式了。代码如下
from scrapy import cmdline cmdline.execute("scrapy crawl cnblog_spider --nolog".split()) #--nolog是以不显示日志的形式运行,如果需要看详细信息,可以去掉现在,我们这个例子就算是写完了,运行main.py,就会生成一个cnblog.Ttxt的文件,里面就是我们爬取下来的内容了。如下图  
最后说一下写这个例子的收获与感想:在敲代码的过程中,发现自己对python一些知识点掌握的还是不够牢固,甚至是while循环一下子都写不出来,以后还是写多点py(别想歪哦)!另外还有一点,有时候真是没压力就没动力,之前学习scrapy时,一直没写出来一个能成功运行的例子,这次在学长的要求下,总算成功写出来了一个。虽然学习之路如此艰难,但绝不应该逃避。加油呀!!!!!
(ps:本人太菜,若有错误的地方欢迎大佬随时责骂。。。。xixixii)
简单的scrapy实例的更多相关文章
- [转]Scrapy简单入门及实例讲解
		Scrapy简单入门及实例讲解 中文文档: http://scrapy-chs.readthedocs.io/zh_CN/0.24/ Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用 ... 
- 审核流(3)低调奢华,简单不凡,实例演示-SNF.WorkFlow--SNF快速开发平台3.1
		下面我们就从什么都没有,结合审核流进行演示实例.从无到有如何快速完美的实现,然而如此简单.低调而奢华,简单而不凡. 从只有数据表通过SNF.CodeGenerator代码生成器快速生成单据并与审核流进 ... 
- 初学redux笔记,及一个最简单的redux实例
		categories: 笔记 tags: react redux 前端框架 把初学redux的一些笔记写了下来 分享一个入学redux很合适的demo, 用redux实现计数器 这是从阮一峰老师git ... 
- HTML与CSS简单页面效果实例
		本篇博客实现一个HTML与CSS简单页面效果实例 index.html <!DOCTYPE html> <html> <head> <meta charset ... 
- 简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息
		简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息 简单的scrapy实战:爬取腾讯招聘北京地区的相关招聘信息 系统环境:Fedora22(昨天已安装scrapy环境) 爬取的开始URL:ht ... 
- Java Tread多线程(0)一个简单的多线程实例
		作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多 ... 
- 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(三)(错误整理篇)
		使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二) 以上两篇已经把流 ... 
- 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二)(代码篇)
		这篇是上一篇的延续: 用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 源代码在github上可以下载,地址:https://github.com/guoxia ... 
- 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一)
		梳理下使用spring+springMVC+mybatis 整合后的一个简单实例:输入用户的 ID,之后显示用户的信息(此次由于篇幅问题,会分几次进行说明,此次是工程的创建,逆向生成文件以及这个简单查 ... 
随机推荐
- linux下一个rsync工具和配置
			本文介绍了整个基本:http://www.2cto.com/os/201308/238733.html 一些简单的备忘录: 1. ubuntu下通过apt-get就可以安装: 2. 配置文件/etc/ ... 
- Delphi 7下最小化到系统托盘(主要是WM_TRAYMSG和WM_SYSCOMMAND消息)
			在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本.定义如下: 123456789 _NOTIFY ... 
- websocket协议学习
			一 实验代码 client.html websocket_server.go package main import ( "crypto/sha1" "encoding/ ... 
- 程序异常崩溃后用windbg辅助调试解决的经验  以及  堆栈问题调试经验
			1,程序异常崩溃后用windbg辅助调试解决的经验 状况:我的程序调用别人的库做 文件写入工作. 在这一过程中出现异常,程序崩溃. 经反复检查,认为自己的程序没有错,但无法判断在别人库里哪里有错. ... 
- Android零基础入门第67节:RecyclerView数据动态更新
			列表的数据往往会跟随业务逻辑不断刷新,所呈现出来的数据需要动态更新,那么RecyclerView是如何动态更新数据的呢? 之前在学习ListView的时候如果数据改变,需要调用notifyDataSe ... 
- Linux文件系统操作与磁盘管理
			简单文件操作 df---->report file system disk space usage du---->estimate file space usage 2.简单的磁盘管理 d ... 
- 如何把zip文件直接解压到内存里?
			解压到硬盘再读进来耽误时间. var LZip: TZipFile; LMem: TMemoryStream; LBytes: TBytes;begin LZip := TZipFile.Cr ... 
- Qt 5 最小构建笔记(只编译QtBase)
			只想用Qt5最基本的功能,因此只编译QtBase.也不想为了编译一个Qt装很多东西(比如非常肥的DirectX SDK) 软件清单: Visual Studio 2010 Professional w ... 
- 所有W版本的函数都在wchar.h文件(_wfopen),和stdlib.h文件(wcstombs),和stdio.h文件(vwprintf)
			C:\Qt\Qt5.6.2\Tools\mingw492_32\i686-w64-mingw32\include\wchar.h C:\Qt\Qt5.6.2\Tools\mingw492_32\i68 ... 
- QT父子窗口事件传递与事件过滤器(讲了一些原理,比较清楚)
			处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现 ... 
