当前位置: 首页 > 后端技术 > Python

scrapy(一)爬取心理学领域的词汇

时间:2023-03-26 18:23:35 Python

1.工作背景组的知识图谱项目需要用专业领域的实体名词和关系来构建,我已经从搜狗官网下载了心理学词库.酷的想法来源于知乎的一篇文章《只要5分钟!各专业词库任你挑》。下载词库后,需要将.scel文件格式转换为.txt,并附到Github上。本文的任务就是根据这些心理词汇获取百度百科的非结构化数据。我学习过程中的大框架跟随了简书的一个大牛StevenZhou,他的scrapy使用系列文章非常不错。不过在工程实践方面,参考的是具体的项目《农业领域知识图谱构建》,这个Github的代码解释很详细。2、注意scrapy的使用记录。如果要使用Pycharm,需要在项目目录下执行命令,否则无法在pycharm界面显示项目。
step1,创建项目scrapystartproject[项目名称]
step2,查看项目scrapy列表#查看爬虫列表,发现为空scrapygenspider-l#查看当前可以使用的爬虫模板step3、生成爬虫文件#使用基础模板scrapygenspider-tbasicbaiduSpiderbaidu.com注:本项目目录下需要执行的命令命令说明:basic是模板,baiduSpider是爬虫名称,最后是域名命令内部原理:在项目目录下创建一个spider目录在baiduSpider.py文件中,创建BaiduSpider类来爬取数据
step4、爬虫文件内部编写方法1、观察理解baiduSpider.pySpider类中,有我们用来创建爬虫类的参数name、domainname、start_urls,如下图。这里的start_urls是我自己写的。因为我们要爬取这些词条的页面,所以创建一个url列表即可。2.start_urls可以自定义。我的方法是在本地读取文件,url列表传入start_urlsstart_urls=[]file_object=open('psycho_terms.txt','r').read()wordList=file_object.split()#GetVocabulary#ConstructwordList中i的初始地址列表:##生成url列表#cur="http://www.baike.com/wiki/"cur='https://baike.baidu.com/item/'cur=cur+str(i)start_urls.append(cur)3.parse函数使用xpath来表达你要抓取的item的内容。以本项目为例:#抓取详细信息detail=response.xpath("string(//div[@class='lemma-summary'])").extract()[0].strip()detail=detail.replace('\r','').replace('\t','').replace('\xa0','').replace('\n','')item['细节']=detailyielditemparsing:string表示抓取标签下的所有文本,包括字幕标签下的文本测试parse中打印的结果命令:$scrapycrawlbaiduSpider--nolog个人经验:可以在parse中使用print输出调试功能。注意:该命令执行后,如果settings.py中的ITEM_PIPELINES没有取消注释,则不会调用pipline.py,也不会输出到item。
4.使用pipline输出爬虫文件的功能(包括parse功能)经过测试,必须按照自定义规则写入本地。首先,您需要疏通管道。settings.py文件中有一段:ITEM_PIPELINES={'psySpider.pipelines.PsyspiderPipeline':300,}打开注释,然后$scrapycrawlbaiduSpider--nolog命令就会对pipline生效。函数编写:期间遇到一个坑,在补充说明。这个管道类的关键函数是process_item():defprocess_item(self,item,spider):#设置每一行要写入的内容l=str(self.count)+""+str(item["title"])+""+str(item["url"])+""+""+str(item["detail"])+"\n"#""+str(item["title"])+""+str(item["url"])+""+#这里输出,方便程序调试print("检测输出l:")print(l)#将相应信息写入文件self.file.write(l)self.count+=1returnitem5,爬虫结果展示
*补充,个人工作记录整理本节为自己的工作记录整理,内容比较杂乱,可以跳过直接看step4。2.在baiduSpider.py中测试parse3。使用pipline存储文件时遇到的陷阱如图所示。在piplines.py文件中init()函数下创建文件后,在process_item中有一行是Writethecontentinthefile。运行后,发现print(l)行会在终端显示我爬取的结果,但问题是我到处都找不到crawled_details.txt文件(手动创建不会写结果)一),最后在参考别人的代码时发现了问题,原来是init()没有写成__init__()。这里需要注意,startproject命令生成的pipelines文件中的init需要修改为__int__。修改后,目录中也出现了crawled_details.txt文件:写入sparse后,测试命令为scrapycrawlbaiduSpider--nolog