前天实验室的学长要求写一个简单的scrapy工程出来,之前也多少看了点scrapy的知识,但始终没有太明白,刚好趁着这个机会,加深一下对scrapy工作流程的理解。由于临近期末,很多作业要做(其实。。。。。。。。。。。。。。主要还是自己太菜了,嘻嘻),所以决定去搜一个简单的实例模仿一下。

显示搜了一个爬取腾讯招聘网了例子(https://www.cnblogs.com/xinyangsdut/p/7628770.html),动手敲完之后无法运行,试着调式,也无法解决。就又去找了一个爬取博客园的(https://www.jianshu.com/p/78f0bc64feb8),这个例子只能爬取第一页,稍微改了下,可以爬取任意多个页面。再改的时候,也遇到了一下麻烦。还是对scrapy理解不够(其实。。。。。。。还是自己太菜,流下了无知的眼泪),不过最好总算是顺利完成了。下面,简单的解剖一下这个例子。

  1. 首先是编写item文件,根据爬取的内容,定义爬取字段。代码如下:

    import scrapy
    
    class CnblogItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()  #定义爬取的标题
    link = scrapy.Field()   #定义爬取的连接
  2. 编写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有很大的帮助。

  3. 编写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
  4. 更改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文件 }
  5. 编写一个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)

最新文章

  1. 破解SQLServer for Linux预览版的3.5GB内存限制 (RHEL篇)
  2. WPF menu
  3. Github 与Git pages
  4. jQuery:如何验证某个元素是否为空
  5. CryptoAPI与openssl数字签名与验证交互
  6. C语言每日一题之No.7
  7. Linq小技巧
  8. 用Dw CS6运行静态页面出问题
  9. JobTracker,TaskTracker简述
  10. Libgdx 1.6.1发布,跨平台游戏开发框架
  11. 分享腾讯云的Linux服务器连接速度很慢的解决心得(原创)
  12. S0.2 灰度图
  13. vue文件上传
  14. boost多线程入门介绍
  15. MySQL 如何查看表的存储引擎
  16. webservice接口测试wsdl
  17. Bash Shebang 小结
  18. 自学工业控制网络之路2.2-PROFINET
  19. LeetCode OJ 之 Maximal Square (最大的正方形)
  20. jquery file upload使用

热门文章

  1. IP地址的正则表达式
  2. WPF3D图片轮播效果
  3. Matlab随笔之插值与拟合(上)
  4. bigdata_mac下安装spark_scala
  5. C++该typeid和dynamic_cast
  6. Windows静态库和动态库的创建和使用(VS2005)
  7. c# wpf 利用截屏键实现截屏功能
  8. Linux技术学习路线图
  9. iOS开发之应用首次启动显示用户引导
  10. 改善C#程序的建议7:正确停止线程