最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python爬蟲庫scrapy簡單使用實(shí)例詳解

 更新時(shí)間:2020年02月10日 15:52:59   作者:Ricky  
這篇文章主要介紹了python爬蟲庫scrapy簡單使用實(shí)例詳解,需要的朋友可以參考下

最近因?yàn)轫?xiàng)目需求,需要寫個(gè)爬蟲爬取一些題庫。在這之前爬蟲我都是用node或者php寫的。一直聽說python寫爬蟲有一手,便入手了python的爬蟲框架scrapy.

下面簡單的介紹一下scrapy的目錄結(jié)構(gòu)與使用:

首先我們得安裝scrapy框架

pip install scrapy

接著使用scrapy命令創(chuàng)建一個(gè)爬蟲項(xiàng)目:

scrapy startproject questions

相關(guān)文件簡介:

scrapy.cfg: 項(xiàng)目的配置文件

questions/: 該項(xiàng)目的python模塊。之后您將在此加入代碼。

questions/items.py: 項(xiàng)目中的item文件.

questions/pipelines.py: 項(xiàng)目中的pipelines文件.

questions/settings.py: 項(xiàng)目的設(shè)置文件.

questions/spiders/: 放置spider代碼的目錄.

questions/spiders/xueersi.py: 實(shí)現(xiàn)爬蟲的主體代碼.

xueersi.py  爬蟲主體

# -*- 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"] # 目標(biāo)的域名
  # 爬取的目標(biāo)地址
  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 = ['英語','語文','數(shù)學(xué)']
   # 爬蟲開始的時(shí)候,自動(dòng)調(diào)用該方法,如果該方法不存在會(huì)自動(dòng)調(diào)用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方法不存在時(shí),parse方法自動(dòng)被調(diào)用
  def parse(self, response):
     # xpath的選擇器語法不多介紹,可以直接查看官方文檔
    arr = response.xpath("http://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) # 發(fā)出新的請(qǐng)求,獲取每個(gè)分頁所有題目
  # 獲取題目
  def getquestion(self,response):
    for res in response.xpath('//div[@class="main-wrap"]/ul[@class="items"]/li'):
      item = QuestionsItem() # 實(shí)例化Item類
      # 獲取問題
      questions = res.xpath('./div[@class="content-area"]').re(r'<div class="content-area">?([\s\S]+?)<(table|\/td|div|br)')
      if len(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]
        # 獲取難度等級(jí)
        levels = res.xpath('//div[@class="info"]').re(ur'難度:([\s\S]+?)<')
        item['level'] = self.levels.index(levels[0])+1
        
        # 獲取選項(xiàng)
        options = re.findall(ur'[A-D][\..]([\s\S]+?)<(\/td|\/p|br)',content)
        item['options'] = options
        if len(options):
          url = res.xpath('./div[@class="info"]/a/@href').extract()[0]
          request = scrapy.Request(url,callback=self.getanswer)
          request.meta['item'] = item # 緩存item數(shù)據(jù),傳遞給下一個(gè)請(qǐng)求
          yield request
      #for option in options:
  # 獲取答案      
  def getanswer(self,response):
    
    res = response.xpath('//div[@class="part"]').re(ur'<td>([\s\S]+?)<\/td>')
    con = re.findall(ur'([\s\S]+?)<br>[\s\S]+?([A-D])',res[0]) # 獲取含有解析的答案
    if con:
      answer = con[0][1]
      analysis = con[0][0] # 獲取解析
    else:
      answer = res[0]
      analysis = ''
    if answer:
      item = response.meta['item'] # 獲取item
      item['answer'] = answer.strip()
      item['analysis'] = analysis.strip()
      item['answer_url'] = response.url
      yield item # 返回item,輸出管道(pipelines.py)會(huì)自動(dòng)接收該數(shù)據(jù)
 

items.py 數(shù)據(jù)結(jié)構(gòu)定義:

# -*- 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()
  pass

pipelines.py 輸出管道(本例子輸出的數(shù)據(jù)寫入本地?cái)?shù)據(jù)庫):

# -*- 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): 
    # 建立數(shù)據(jù)庫連接 
    self.connect = pymysql.connect('localhost','root','','question',use_unicode=True,charset='utf8') 
    # 獲取游標(biāo) 
    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值,使用該字段過濾重復(fù)的題目
    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
       # 插入選項(xiàng)
      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
 

爬蟲構(gòu)建完畢后,在項(xiàng)目的根目錄下運(yùn)行

scrapy crawl xueersi # scrapy crawl 爬蟲的名稱

更多關(guān)于python爬蟲庫scrapy使用方法請(qǐng)查看下面的相關(guān)鏈接

相關(guān)文章

  • Python OpenCV圖像顏色變換示例

    Python OpenCV圖像顏色變換示例

    大家好,本篇文章主要講的是Python OpenCV圖像顏色變換示例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Django基于客戶端下載文件實(shí)現(xiàn)方法

    Django基于客戶端下載文件實(shí)現(xiàn)方法

    這篇文章主要介紹了Django基于客戶端下載文件實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Python?from?import導(dǎo)包ModuleNotFoundError?No?module?named找不到模塊問題解決

    Python?from?import導(dǎo)包ModuleNotFoundError?No?module?named

    最近在執(zhí)行python腳本時(shí),from?import的模塊沒有被加載進(jìn)來,找不到module,這篇文章主要給大家介紹了關(guān)于Python?from?import導(dǎo)包ModuleNotFoundError?No?module?named找不到模塊問題的解決辦法,需要的朋友可以參考下
    2022-08-08
  • python 列表輸出重復(fù)值以及對(duì)應(yīng)的角標(biāo)方法

    python 列表輸出重復(fù)值以及對(duì)應(yīng)的角標(biāo)方法

    今天小編就為大家分享一篇python 列表輸出重復(fù)值以及對(duì)應(yīng)的角標(biāo)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 對(duì)命令行模式與python交互模式介紹

    對(duì)命令行模式與python交互模式介紹

    今天小編就為大家分享一篇對(duì)命令行模式與python交互模式介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • Django自定義User模型、認(rèn)證、權(quán)限控制的操作

    Django自定義User模型、認(rèn)證、權(quán)限控制的操作

    這篇文章主要介紹了Django自定義User模型、認(rèn)證、權(quán)限控制的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • python: line=f.readlines()消除line中\(zhòng)n的方法

    python: line=f.readlines()消除line中\(zhòng)n的方法

    這篇文章主要介紹了python: line=f.readlines()消除line中\(zhòng)n的方法,需要的朋友可以參考下
    2018-03-03
  • Python做圖像處理及視頻音頻文件分離和合成功能

    Python做圖像處理及視頻音頻文件分離和合成功能

    這篇文章主要介紹了Python做圖像處理及視頻音頻文件分離和合成功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • python使用numpy生成18種特殊數(shù)組

    python使用numpy生成18種特殊數(shù)組

    這篇文章主要介紹了python使用numpy生成18種特殊數(shù)組的方法,文章通過代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的參考價(jià)值,需要的朋友可以參考下
    2023-09-09
  • 利用selenium爬蟲抓取數(shù)據(jù)的基礎(chǔ)教程

    利用selenium爬蟲抓取數(shù)據(jù)的基礎(chǔ)教程

    這篇文章主要給大家介紹了關(guān)于如何利用selenium爬蟲抓取數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用selenium具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06

最新評(píng)論

和平县| 陵川县| 连云港市| 微山县| 工布江达县| 宁国市| 紫云| 东阳市| 长岭县| 石楼县| 台江县| 绥江县| 合阳县| 柳河县| 重庆市| 绍兴县| 河源市| 驻马店市| 西乌珠穆沁旗| 朝阳区| 盐边县| 宿松县| 庆阳市| 于田县| 东山县| 兴仁县| 文水县| 石渠县| 甘南县| 福鼎市| 城步| 滦南县| 古交市| 明溪县| 台安县| 海伦市| 桂林市| 南江县| 通州市| 舟曲县| 子洲县|