圆月山庄资源网 Design By www.vgjia.com
最近因为项目需求,需要写个爬虫爬取一些题库。在这之前爬虫我都是用node或者php写的。一直听说python写爬虫有一手,便入手了python的爬虫框架scrapy.
下面简单的介绍一下scrapy的目录结构与使用:
首先我们得安装scrapy框架
pip install scrapy
接着使用scrapy命令创建一个爬虫项目:
scrapy startproject questions
相关文件简介:
scrapy.cfg: 项目的配置文件
questions/: 该项目的python模块。之后您将在此加入代码。
questions/items.py: 项目中的item文件.
questions/pipelines.py: 项目中的pipelines文件.
questions/settings.py: 项目的设置文件.
questions/spiders/: 放置spider代码的目录.
questions/spiders/xueersi.py: 实现爬虫的主体代码.
xueersi.py"htmlcode">
# -*- coding: utf-8 -*- import scrapy import time import numpy import re from questions.items import QuestionsItem class xueersiSpider(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方法 # def start_requests(self): # yield scrapy.Request('http://tiku.xueersi.com/shiti/list_1_2_0_0_4_0_39',callback=self.getquestion) # start_requests方法不存在时,parse方法自动被调用 def parse(self, response): # xpath的选择器语法不多介绍,可以直接查看官方文档 arr = response.xpath("//ul[@class='pagination']/li/a/text()").extract() total_page = arr[3] # 获取分页 for index in range(int(total_page)): yield scrapy.Request(response.url.replace('_0_0_4_0_1',"_0_0_4_0_"+str(index)),callback=self.getquestion) # 发出新的请求,获取每个分页所有题目 # 获取题目 def getquestion(self,response): for res in response.xpath('//div[@class="main-wrap"]/ul[@class="items"]/li'): item = QuestionsItem() # 实例化Item类 # 获取问题 questions = res.xpath('./div[@class="content-area"]').re(r'<div class="content-area">"info"]').re(ur'难度:([\s\S]+"info"]/a/@href').extract()[0] request = scrapy.Request(url,callback=self.getanswer) request.meta['item'] = item # 缓存item数据,传递给下一个请求 yield request #for option in options: # 获取答案 def getanswer(self,response): res = response.xpath('//div[@class="part"]').re(ur'<td>([\s\S]+"htmlcode"># -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # https://doc.scrapy.org/en/latest/topics/items.html import scrapy class QuestionsItem(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 -*- # Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html import pymysql import md5 class QuestionsPipeline(object): def __init__(self): # 建立数据库连接 self.connect = pymysql.connect('localhost','root','','question',use_unicode=True,charset='utf8') # 获取游标 self.cursor = self.connect.cursor() print("connecting mysql success!") self.answer = ['A','B','C','D'] def process_item(self, item, spider): content = pymysql.escape_string(item['content']) # 获取题目hash值,使用该字段过滤重复的题目 m1 = md5.new() m1.update(content) hash = m1.hexdigest() selectstr = "select id from question where hash='%s'"%(hash) self.cursor.execute(selectstr) res = self.cursor.fetchone() # 过滤相同的题目 if not res: # 插入题目 sqlstr = "insert into question(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 # 插入选项 for index in range(len(item['options'])): option = item['options'][index] answer = self.answer.index(item['answer']) if answer==index: ans = '2' else: ans = '1' sqlstr = "insert into options(content,qid,answer) VALUES('%s','%s','%s')"%(pymysql.escape_string(option[0]),qid,ans) self.cursor.execute(sqlstr) self.connect.commit() #self.connect.close() return item爬虫构建完毕后,在项目的根目录下运行
scrapy crawl xueersi # scrapy crawl 爬虫的名称更多关于python爬虫库scrapy使用方法请查看下面的相关链接
圆月山庄资源网 Design By www.vgjia.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
圆月山庄资源网 Design By www.vgjia.com
暂无评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年11月02日
2024年11月02日
- 明达年度发烧碟MasterSuperiorAudiophile2021[DSF]
- 英文DJ 《致命的温柔》24K德国HD金碟DTS 2CD[WAV+分轨][1.7G]
- 张学友1997《不老的传说》宝丽金首版 [WAV+CUE][971M]
- 张韶涵2024 《不负韶华》开盘母带[低速原抓WAV+CUE][1.1G]
- lol全球总决赛lcs三号种子是谁 S14全球总决赛lcs三号种子队伍介绍
- lol全球总决赛lck三号种子是谁 S14全球总决赛lck三号种子队伍
- 群星.2005-三里屯音乐之男孩女孩的情人节【太合麦田】【WAV+CUE】
- 崔健.2005-给你一点颜色【东西音乐】【WAV+CUE】
- 南台湾小姑娘.1998-心爱,等一下【大旗】【WAV+CUE】
- 【新世纪】群星-美丽人生(CestLaVie)(6CD)[WAV+CUE]
- ProteanQuartet-Tempusomniavincit(2024)[24-WAV]
- SirEdwardElgarconductsElgar[FLAC+CUE]
- 田震《20世纪中华歌坛名人百集珍藏版》[WAV+CUE][1G]
- BEYOND《大地》24K金蝶限量编号[低速原抓WAV+CUE][986M]
- 陈奕迅《准备中 SACD》[日本限量版] [WAV+CUE][1.2G]