python爬虫库scrapy简单使用实例详解
最近因为项目需求,需要写个爬虫爬取一些题库。在这之前爬虫我都是用node或者php写的。一直听说python写爬虫有一手,便入手了python的爬虫框架scrapy.
下面简单的介绍一下scrapy的目录结构与使用:
首先我们得安装scrapy框架
pipinstallscrapy
接着使用scrapy命令创建一个爬虫项目:
scrapystartprojectquestions
相关文件简介:
scrapy.cfg:项目的配置文件
questions/:该项目的python模块。之后您将在此加入代码。
questions/items.py:项目中的item文件.
questions/pipelines.py:项目中的pipelines文件.
questions/settings.py:项目的设置文件.
questions/spiders/:放置spider代码的目录.
questions/spiders/xueersi.py:实现爬虫的主体代码.
xueersi.py 爬虫主体
#-*-coding:utf-8-*- importscrapy importtime importnumpy importre fromquestions.itemsimportQuestionsItem classxueersiSpider(scrapy.Spider): name="xueersi"#爬虫名字 allowed_domains=["tiku.xueersi.com"]#目标的域名 #爬取的目标地址 start_urls=[ "http://tiku.xueersi.com/shiti/list_1_1_0_0_4_0_1", "http://tiku.xueersi.com/shiti/list_1_2_0_0_4_0_1", "http://tiku.xueersi.com/shiti/list_1_3_0_0_4_0_1", ] levels=['偏易','中档','偏难'] subjects=['英语','语文','数学'] #爬虫开始的时候,自动调用该方法,如果该方法不存在会自动调用parse方法 #defstart_requests(self): #yieldscrapy.Request('http://tiku.xueersi.com/shiti/list_1_2_0_0_4_0_39',callback=self.getquestion) #start_requests方法不存在时,parse方法自动被调用 defparse(self,response): #xpath的选择器语法不多介绍,可以直接查看官方文档 arr=response.xpath("//ul[@class='pagination']/li/a/text()").extract() total_page=arr[3] #获取分页 forindexinrange(int(total_page)): yieldscrapy.Request(response.url.replace('_0_0_4_0_1',"_0_0_4_0_"+str(index)),callback=self.getquestion)#发出新的请求,获取每个分页所有题目 #获取题目 defgetquestion(self,response): forresinresponse.xpath('//div[@class="main-wrap"]/ul[@class="items"]/li'): item=QuestionsItem()#实例化Item类 #获取问题 questions=res.xpath('./div[@class="content-area"]').re(r'?([\s\S]+?)<(table|\/td|div|br)') iflen(questions): #获取题目 question=questions[0].strip() item['source']=question dr=re.compile(r'<[^>]+>',re.S) question=dr.sub('',question) content=res.extract() item['content']=question #获取课目 subject=re.findall(ur'http:\/\/tiku\.xueersi\.com\/shiti\/list_1_(\d+)',response.url) item['subject']=self.subjects[int(subject[0])-1] #获取难度等级 levels=res.xpath('//div[@class="info"]').re(ur'难度:([\s\S]+?)<') item['level']=self.levels.index(levels[0])+1 #获取选项 options=re.findall(ur'[A-D][\..]([\s\S]+?)<(\/td|\/p|br)',content) item['options']=options iflen(options): url=res.xpath('./div[@class="info"]/a/@href').extract()[0] request=scrapy.Request(url,callback=self.getanswer) request.meta['item']=item#缓存item数据,传递给下一个请求 yieldrequest #foroptioninoptions: #获取答案 defgetanswer(self,response): res=response.xpath('//div[@class="part"]').re(ur' ([\s\S]+?)<\/td>') con=re.findall(ur'([\s\S]+?)
[\s\S]+?([A-D])',res[0])#获取含有解析的答案 ifcon: answer=con[0][1] analysis=con[0][0]#获取解析 else: answer=res[0] analysis='' ifanswer: item=response.meta['item']#获取item item['answer']=answer.strip() item['analysis']=analysis.strip() item['answer_url']=response.url yielditem#返回item,输出管道(pipelines.py)会自动接收该数据items.py数据结构定义:
#-*-coding:utf-8-*- #Defineherethemodelsforyourscrapeditems # #Seedocumentationin: #https://doc.scrapy.org/en/latest/topics/items.html importscrapy classQuestionsItem(scrapy.Item): content=scrapy.Field() subject=scrapy.Field() level=scrapy.Field() answer=scrapy.Field() options=scrapy.Field() analysis=scrapy.Field() source=scrapy.Field() answer_url=scrapy.Field() passpipelines.py输出管道(本例子输出的数据写入本地数据库):
#-*-coding:utf-8-*- #Defineyouritempipelineshere # #Don'tforgettoaddyourpipelinetotheITEM_PIPELINESsetting #See:https://doc.scrapy.org/en/latest/topics/item-pipeline.html importpymysql importmd5 classQuestionsPipeline(object): def__init__(self): #建立数据库连接 self.connect=pymysql.connect('localhost','root','','question',use_unicode=True,charset='utf8') #获取游标 self.cursor=self.connect.cursor() print("connectingmysqlsuccess!") self.answer=['A','B','C','D'] defprocess_item(self,item,spider): content=pymysql.escape_string(item['content']) #获取题目hash值,使用该字段过滤重复的题目 m1=md5.new() m1.update(content) hash=m1.hexdigest() selectstr="selectidfromquestionwherehash='%s'"%(hash) self.cursor.execute(selectstr) res=self.cursor.fetchone() #过滤相同的题目 ifnotres: #插入题目 sqlstr="insertintoquestion(content,source,subject,level,answer,analysis,hash,answer_url)VALUES('%s','%s','%s','%s','%s','%s','%s','%s')"%(content,pymysql.escape_string(item['source']),item['subject'],item['level'],item['answer'],pymysql.escape_string(item['analysis']),hash,item['answer_url']) self.cursor.execute(sqlstr) qid=self.cursor.lastrowid #插入选项 forindexinrange(len(item['options'])): option=item['options'][index] answer=self.answer.index(item['answer']) ifanswer==index: ans='2' else: ans='1' sqlstr="insertintooptions(content,qid,answer)VALUES('%s','%s','%s')"%(pymysql.escape_string(option[0]),qid,ans) self.cursor.execute(sqlstr) self.connect.commit() #self.connect.close() returnitem爬虫构建完毕后,在项目的根目录下运行
scrapycrawlxueersi#scrapycrawl爬虫的名称更多关于python爬虫库scrapy使用方法请查看下面的相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
热门推荐
- 返回顶部
- 3162201930
- czq8825@qq.com