AIBigData four:使用scrapy爬取网站,按照指定的格式存入txt文本的详细过程复盘

news/2024/5/20 23:01:17/文章来源:https://blog.csdn.net/weixin_41931602/article/details/80336601

用了将近两个星期,终于对scrapy有了初步了解,并且使用scrapy来爬取到了动态加载的网页。再此给自己这两周的学习成果做一个详细的过程复盘,顺带重温下忘掉的知识。

首先看看项目要求。


要爬取的是左边的四个大板块里的四个小版块的文章,然后按照以下的格式保存在文档中。

最终爬取的结果是这样的:






接下来让我们看看具体过程是怎样的?

1.打开命令行,跳转到指定文件存放的目录下,新建一个scrapy项目。如下所示

cd C:\Users\ME\Desktop\Python project\pachong\scrapy

scrapy startproject test(项目名称)



我们可以看到有两个提示:

You can start your first spider with:
    cd test1

    scrapy genspider example example.com

第一个就是直接跳转到项目根目录下。

第二个就是新建爬虫文件,新建爬虫文件我们可以在spiders目录下创建,建议使用scrapy genspider example example.com

example指的是爬虫文件,example.com指的是要爬取的网址首页,也就是最开始的首页。

我们先跳转到根目录下 cd test1之后,输入: scrapy genspider finance business.sohu.com

在pycharm中就会自动生成文件,并且在爬虫文件finance.py中自动生成一些代码,不然的话还要自己手打,忒麻烦。




scrapy.cfg: 项目的配置文件
test1/: 该项目的python模块。之后您将在此加入代码。
test1/items.py: 项目中的item文件.
test1/pipelines.py: 项目中的pipelines文件.
test1/settings.py: 项目的设置文件
test1/spiders/: 放置spider代码的目录.


Scrapy默认是不能在IDE中调试的,所以呢我们要新建一个文件放到根目录下,这个名字你喜欢怎么取都行,这里举一个例子。

在根目录中新建一个py文件叫:main.py;在里面写入以下任意一个内容,但是要注意文件名是你的爬虫名字这个很关键。这里的爬虫名字就是finance


from scrapy import cmdline
name ='finance'
cmd = 'scrapy crawl {0}{1}'.format(name,'')
cmdline.execute(cmd.split())
from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'finance'])
# from scrapy.cmdline import execute
# import os
# import sys
# #因为每次要输入副目录很麻烦,通过调用这两个模块,能够快速找到main文件的副目录
# sys.path.append(os.path.dirname(os.path.abspath(__file__)))
# #print os.path.dirname(os.path.abspath(__file__))
# #添加完命令之后,我们在项目下的Spyder的爬虫文件就可以设置断点进行调试了
# execute(['scrapy','crawl','finance'])


首先了解下scrapy爬虫是怎么工作的,我们在官方文档中看到这幅图:






我们再回过头来看看创建的爬虫文件



在开始编辑爬虫文件之前,我们做一些基本的准备工作。

1.在settings.py中取消最下面几行的注释:作用在于Scrapy会缓存你有的Requests!当你再次请求时,如果存在缓存文档则返回缓存文档,而不是去网站请求,这样既加快了本地调试速度,也减轻了 网站的压力。一举多得




2.在items.py 文件中根据需求定义一些字段

比如说大板块的名字,url,小版块的名字,url,新闻作者,发布时间,抓取时间,标题,正文等等。

这样爬虫爬取的文件就会对应保存在相关的字段中了。




好了,是不是已经等不及了,我们现在就开始编写我们的爬虫文件

首先先把一些需要使用的包给导入进去,这样方便之后的编写。具体哪些包有什么用,自行百度就好。



接下来看看类,以及开始的url设置。我们先点击到网页,右键检查网页源代码。使用谷歌浏览器也可以F12检查网页。

可以看到我们想要的四个版块的url分别是:

http://business.sohu.com/994

http://business.sohu.com/996

http://business.sohu.com/997

http://business.sohu.com/998




所以在这里我们用一个for循环和if语句得到想要的四个数字994,996,997,998




在这里我们的yield主要是将生成的url传递给下一个函数,在调用下一个函数的时候,记得别忘了添加self。

yield的作用大概如下:



举个例子:

#encoding:UTF-8

def yield_test(n): for i in range(n): yield call(i) print("i=",i) #做一些其它的事情 print("do something.") print("end.") def call(i): return i*2 #使用for循环 for i in yield_test(5): print(i,",")

使用parse函数接受上面request获取到的response。(不要轻易改写parse函数;因为这样request的回调函数被你用了,就没谁接受request返回的response啦!如果你非要用作它用,则需要自己给request一个回调函数哦!)

接下来我们来编写parse函数,先把代码贴上来:

对这个函数做一些细节性的解释吧!

首先我们要匹配到大小版块的url和名字,我们可以采用xpath,css,bs4,以及正则表达式,在这里我们使用的是scrapy自带的xpath或者css来进行匹配。

因为网页的布置基本是一样的,所以在此我们以 宏观 为例子进行。

首先在命令行窗口输入scrapy shell http://business.sohu.com/994    进入shell窗口这样就很好调试了,当然在每句话后设置断点,加print语句后,再在main文件调试也是可以的,点击绿色的小虫子就可以。

如下所示

在scrapy shell中主要有两种方法:xpath和css,可以参考官方文档,也可以百度一些别人整理的。

主要看的是标签后的两个属性:id ,class

接下来我们试验一下。匹配四个小板块的url,分别是:

对应的标签是div,属性有很多,挑其中一个box-cur。接下来是h4,然后是a

所以我们输入response.css(".box-cur p a::attr(href)")   还有    response.css(".box-cur p a::attr(href)").extract()   ,感受一下区别。可以自行了解下extract()的用法

接下来是xpath,xpath的语法可以自行百度,也可以直接在浏览器中右键检查,找到指定想要的标签,右键copy xpath,轻轻松松粘贴复制 

接下来输入response.xpath('//*[@id="left-nav"]/div[2]/div[2]/p[1]/a/text()')和 response.xpath('//*[@id="left-nav"]/div[2]/div[2]/p[1]/a/text()').extract()

接下来看看结果

在这里提提自己遇到的一些错误 :

1.xpath粘贴的话容易出错,最好还是懂一点语法,按照语法写才能正确匹配到想要的,纯粹复制只能定位到一个

2.注意网址和你匹配的内容是否一致,不然容易出现【】

3.注意xpath里的单引号和双引号,别重叠在一起

4.(挖坑待填)

这里顺带提一些常用的语法

  

在命令行窗口匹配成功后,我们就复制到pycharm中。

37行-41行,使用for循环遍历大板块,顺便使用if语句和os版块来创建大板块新目录,记得代码一开始别忘了# !/usr/bin/python

这个是用来说明创建文件夹的

42行-53行,使用for循环遍历小版块,继续创建小板块新目录。然后得到url,但是这种是缺省url,所以我们需要在构建一下,添加http:,然后print语句,调试看看是否正确。

正确之后,我们把得到的正确变量赋值给字典里。

54行-58行,设置断点,验证items的结果是否是你想要的。如果是就继续,不是就找找错误的原因。58行就多了一个meta这么一个字典,这是Scrapy中传递额外数据的方法。我们还有一些其他内容需要在下一个页面中才能获取到

为什么要使用字典?因为这样可以将多个数据进行打包传递。想想看,如果你一个个数据传,而且这些数据还要一个个赋值给下一个函数的变量,效率多低,最重要是累啊!python的宗旨不是越简洁越好嘛!

每次得到一个需要的变量,都要测试一下是否符合自己想要的数据。前面保持正确了,后面才能正常输出。不然到时全部写完再进行调试,就非常麻烦了,而且后面的代码是错误的话,前面的就算设置了断点一样会出错。

在这里遇到过一个错误,卡了一天

错误:yield Request(url=post_url, callback=self.parse_news, meta={'item_1': item})

正确:yield Request(url=item['post_url'], callback=self.parse_news, meta={'item_1': item})

使用错误的话就只会爬到一个小版块,因为虽然循环遍历了列表,但是得到的post_url始终是相同的,之所以会错,是因为对字典的数据调用不熟悉,现在改为item['post_url'],得到的网址就是四个小版块的网址了。

继续继续,编程最重要的是学会解决问题,遇到问题不要怕,一个个检查问题出在哪里就好。

parse_news函数的作用是得到小版块中的所有文章的url,然后传递给下一个函数

67行-70行,将上一个函数得到的字典赋值给新字典item_1,顺便建立一个新的列表装东西,还有就是匹配到所有文章的链接。

71行-75行,定义一个具体browser对象,然后使用get函数得到文章的url。接下来使用for循环,目的是模仿人一样滑动进度条,实现抓取动态网页的效果。range()指的是范围多少秒。time.slepp(1)表示的是一秒动一下。

76行-86行,和上一个函数作用相似,遍历所有的文章url,然后构造url,再把得到的数据一个个封装进item这个字典中,然后将一个个字典当做元素装进列表items中。

87行-89行,验证下得到的列表items里的数据是否是你想要的。然后一个个传递给下一个函数

写了这么多,懒癌又要犯了。洗把脸冷静一下。

好我们继续来看,这个函数的主要作用呢就是要开始捕捉文章的具体字段了,开不开心?

xpath和css都讲完了,这里我们来提提bs4 的用法。

参考这篇文章吧

 http://www.jb51.net/article/65287.htm

92-99行,得到上一个函数的字典,然后新建一个对象。之中我们一样进行调试,看看有没有什么错误。好的,没有,那我们继续往下看。

100-156行,获取作者并且进行判断,如果没有作者,就输出为none.后面同样的做法。这里提一下标签,因为标签我们是需要使用逗号隔离开的,因为得到的标签是列表,所以就使用join函数来将列表的元素串起来。

157-176行,将所有得到的按照我们需要的格式一个个赋值给字典。需要注意的是

item['website_name'] =str(item['website_name']),因为得到的item['website_name']类型是Unicode,这里把它转化成str类型。最后提交给item文件处理。


items得到数据之后,将数据传递给了pipeline文件,在这里我们来存取文件,选择最简单基础的方法,有兴趣可以去了解一些存储库,比如MySQL。

这里不需要多讲了,打开文件,写入文件,然后关闭文件。好的,下一个。。。。。。

一直循环往复,直到抓取完毕

还有一个要设置的就是settings文件




最后面点击运行main文件或者在命令行窗口输入scrapy crawl finance即可爬取文章了。不妨动手试试看吧!

(挖坑待填)



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_786761.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用scrapy做爬虫遇到的一些坑:网站常用的反爬虫策略,如何机智的躲过反爬虫Crawled (403)

在这幅图中我们可以很清晰地看到爬虫与反爬虫是如何进行斗智斗勇的。 在学习使用爬虫时,我们制作出来的爬虫往往是在“裸奔”,非常的简单。 简单低级的爬虫有一个很大的优点:速度快,伪装度低。如果你爬取的网站没有反爬机制&#…

马云称自己的成就无关科技与钱;任正非:外籍员工可当华为 CEO,但有条件;雅虎宣布逐步关闭雅虎群组网站 | EA周报...

EA周报2019年10月18日每个星期7分钟,元宝带你喝一杯IT人的浓缩咖啡,了解天下事、掌握IT核心技术。热点大事件丰巢回应小学生用照片“刷脸”取件:测试版,已第一时间下线有报道称“小学生发现丰巢快递柜刷脸取件漏洞,用照…

学习nginx所遇到的坑:Mac如何在nginx上创建新的网站?

首先,掌握基本的知识。 改配置文件: vi /usr/local/etc/nginx/nginx.conf 改html文件:vi /usr/local/Cellar/nginx/1.15.8/html/**.html 重启nginx: nginx -s reload -c 首先改动配置文件 ,找到以下图片中的代码 从注释中我们…

第一次上传成功jsp网站总结

今天费了一下午功夫才上传成功一个jsp网站,现在总结下: 一般jsp网站分为两部分:1,网站部分 2,数据库部分。 要想在外网看到自己上传的jsp网站: 1,要有一个域名和空间,我今天用的是…

部署 HSTS 提升网站安全性

什么是 HSTS? HSTS 是 HTTP Strict Transport Security 的缩写,字面意思就是“HTTP 严格传输安全”。在 2012 年 11 月发布了RFC 文件。其实质,是通过服务器和浏览器配合起来,强制用户使用安全连接来访问服务器。 HSTS 大致原理…

网站搭建 -- 部署Https 证书 缺少 Root CA Certificate

测试网站 我们在搭建web站点时,为了安全,现在都要使用SSL证书。 一个好用的测试网站可以检测你的SSL配置是否正确。 https://www.geocerts.com/ssl-checker 该网站可以自定义检测的端口(大部分检测网站都只能使用默认端口443)…

揭秘DDoS黑市:50块钱就能击瘫一家网站

前两天,阿里云在微博上发布一则声明,称12月20-21日间,部署在阿里云上的某知名游戏公司,遭遇了全球互联网史上最大的一次DDoS攻击。 DDoS是一种在互联网地下非常常见的攻击方式,可以称作黑客入门的基础技巧。但要做到像…

WordPress开发之创建WordPress会员网站(一)

问题 Wordpress是世界范围内广泛推荐的网站开发平台,尽管创建一个基于WordPress的基础型博客网站是一个一小时左右就能完成的工作,但是,要想把这个网站进一步完善,特别是把WordPress网站修改成一个真正意义上的中小型电子商务网站…

HTML5初学者福利!11个在线学习网站推荐

2019独角兽企业重金招聘Python工程师标准>>> HTML5的强大及流行趋势,让更多的人想要系统的对它进行学习。而大多数人获取HTML5知识的重要途径都是网络,不过面对五花八门的搜索结果,是不是觉得摸不着头脑,无法抉择&…

Scrapy和Django实现蚌埠医学院手机新闻网站制作

最终效果(不看效果就讲过程都是耍流氓): 实现过程如下: 框架: Scrapy:数据采集Django:数据呈现目标网站:蚌埠医学院 学院新闻列表:http://www.bbmc.edu.cn/index.php/view/viewcate/0/ 第一步&a…

收集喜欢的网站元素

1、https://letters-inc.jp/2、https://clarity.io/。。。

高性能网站建设进阶指南:Web开发者性能优化最佳实践

高性能网站建设进阶指南:Web开发者性能优化最佳实践 基本信息 作者: 口碑网前端团队 出版社:电子工业出版社 ISBN:9787121105449 上架时间:2010-4-9 出版日期:2010 年4月 开本:16开 其他详细…

WordPress 捐赠插件漏洞,导致网站遭受零日攻击

开发四年只会写业务代码,分布式高并发都不会还做程序员? 使用“Total Donations”插件的 WordPress 网站,Defiant 建议网站管理员从他们的服务器中删除该插件,防止黑客利用其代码漏洞攻击网站。过去一周,来自 Defian…

分享一些好用的网站

前言 这两年收藏了不少网站,特地整理一下,把一些大家都可能用得上的分享出来,希望能对你有用。 考虑到有一些网站大多数人都知道,所以我就不列出来了。 我把这些网站分为了几大类: 工具类素材类社区类工具类 1、start.…

阿里云 - 免费 CA 证书申请 + Nginx 实现网站https部署 + http强制跳转https

1,进入阿里云,找到导航栏下安全下有个CA证书服务; 2,点进去之后点击立即购买; 3,点进来默认是看不到免费的,点击Symantec; 4,然后点击增强型; 5&#xff…

程序员网站推荐

希望你能遇到更好的网站。 1.git学习 猴子都能懂的GIT入门 https://backlog.com/git-tutorial/cn/stepup/stepup1_1.html 2.问答平台 stackoverflow https://stackoverflow.com/ n.遇到了再添加 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可…

6个超给力网站资源共享 一分钟吊起你的兴趣

超给力的网站资源分享给你们,娱乐、生活、学习应有尽有,赶紧来看看吧! 千千音乐:http://music.taihe.com/songlist千千音乐是中国音乐门户之一,为你提供海量正版高品质音乐,权威的音乐榜单,快速的新歌速递,契合你的主题电台,人性化…

51CTO网站博客更新声明

51CTO博客自成立以来,受到网友广泛关注,为了能够提供更好的服务,51CTO网站决定对博客栏目进行大幅度改版。 截止到6月25日,网站后台管理界面风格已经调整完成,此目的是为了能让广大使用者更方便地使用我们的博客产品。…

学习前端的好处,网站文章复制不了?别扯.

很多时候我们在网上浏览文章或查看资料的时候,看到写的非常好的句子想要复制粘贴保存一下,这是拖动鼠标,发现“选不中,复制不了”,哎,这时候咱们前端高能出手,这都不是事儿!很简单&a…

python爬取证券之星网站

周末无聊,找点乐子。。。#coding:utf-8 import requests from bs4 import BeautifulSoup import random import time#抓取所需内容 user_agent ["Mozilla/5.0 (Windows NT 10.0; WOW64)", Mozilla/5.0 (Windows NT 6.3; WOW64),Mozilla/5.0 (Windows NT …